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? _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
