[cfe-commits] r161703 - in /cfe/trunk: include/clang/AST/Stmt.h lib/AST/Stmt.cpp

Eli Friedman eli.friedman at gmail.com
Mon Aug 13 14:52:56 PDT 2012


On Mon, Aug 13, 2012 at 2:36 PM, Abramo Bagnara
<abramo.bagnara at gmail.com> 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 <ripzonetriton at gmail.com
>> <mailto:ripzonetriton at gmail.com>> 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




More information about the cfe-commits mailing list