On Mon, Aug 13, 2012 at 2:36 PM, Abramo Bagnara <[email protected]> wrote: > Il 13/08/2012 22:36, Chandler Carruth ha scritto: >> Just to explain perhaps a bit more, as I too agree with Eli and Chad here... >> >> On Mon, Aug 13, 2012 at 4:36 AM, João Matos <[email protected] >> <mailto:[email protected]>> wrote: >> >> I agree, it would be best to store one node per statement in the >> AST, even if semantically they will be handled as one. >> >> >> This is a pretty fundamental deviation from the model for the AST. >> >> We have AST nodes to represent the structural semantics of the program. >> Many of these do not even correspond to syntax in the source program. >> They are there to expose the underlying semantics of the structure after >> parsing has taken place. The inverse applies here: even though there may >> be syntax recognized by the parser that resembles that of multiple >> statements, if the actual semantic model is that of a single statement, >> the AST should reflect that. >> >> When you say "It would be best to store one node per statement in the >> AST" you are begging the question by assuming there are multiple >> statements in the source program. I think what Eli and Chad are arguing >> is that there is exactly one node per statement in the AST, and all of >> the inline asm instructions are part of a single statement due to their >> semantic model. > > I'm really failing to understand how multiple __asm keyword with their > arguments can be considered a single statement... > > In http://msdn.microsoft.com/en-us/library/45yd4tzz.aspx it is stated > clearly that: > >> Because the __asm keyword is a statement separator, you can also put > > assembly instructions on the same line: > >> __asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al > > So these are definitely (according to Microsoft documentation) three > statements and not one. > > That apart, currently clang AST rather surprisingly looks like: > > void p1() { > asm nop > asm nop > } > > void p2() { > asm { nop } > asm { nop } > } > > void q1() { > asm nop; > asm nop; > } > > void q2() { > asm { nop }; > asm { nop }; > } > > > void p1() (CompoundStmt 0x3114ec0 <p.cc:2:11, line:5:1> > (MSAsmStmt 0x3114e40 <line:3:3, line:4:7>)) > > > void p2() (CompoundStmt 0x3141378 <p.cc:7:11, line:10:1> > (MSAsmStmt 0x3114fa0 <line:8:3, line:9:13>)) > > > void q1() (CompoundStmt 0x31414d0 <p.cc:12:11, line:15:1> > (MSAsmStmt 0x3141450 <line:13:3, line:14:10>)) > > > void q2() (CompoundStmt 0x31416a0 <p.cc:17:11, line:20:1> > (MSAsmStmt 0x31415b0 <line:18:3, col:13>) > (NullStmt 0x3141618 <col:14>) > (MSAsmStmt 0x3141628 <line:19:3, col:13>) > (NullStmt 0x3141690 <col:14>)) > > What is special in q2? Why the NullStmt?
Err, that looks like a bug. -Eli _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
