[cfe-dev] check an AST node's parent node ?
Philip Craig
philipjcraig at gmail.com
Mon Jan 7 23:42:51 PST 2013
On 8 January 2013 17:20, Kim Gräsman <kim.grasman at gmail.com> wrote:
> Hi kevinlynx,
>
> Not a direct answer to your question, but...
>
> On Tue, Jan 8, 2013 at 7:48 AM, kevinlynx <kevinlynx at gmail.com> wrote:
>> In my coding standard checking tool, it limits comma expression usage,
>> except in a for statment, i.e:
>>
>> x++, x+=1; // this will be marked as invalid usage
>> for (x = 0, y = 0; ...) // but this comma expression is valid
>>
>> I can implement `VisitBinComma`, this function will be called when parsed
>> comma expression. But how to know if this comma expression is in a for
>> statment ?
>
> ... you can use -ast-dump to see what the AST for a representative
> sample looks like:
>
> --
> // commaop.cpp
> int main() {
> int x = 0;
>
> x++, x += 1;
>
> for (int x = 0, y = 0; x < 10; ++x, --y)
> ;
> }
> --
>
> --
> $ clang -cc1 -ast-dump commaop.cpp
> (TranslationUnitDecl 0x600960 <<invalid sloc>>
> (TypedefDecl 0x600c50 <<invalid sloc>> __builtin_va_list 'char *')
> (FunctionDecl 0x600cc0 <D:\temp\commaop.cpp:2:1, line:9:1> main 'int (void)'
> (CompoundStmt 0x601050 <line:2:12, line:9:1>
> (DeclStmt 0x600db0 <line:3:3, col:12>
> (VarDecl 0x600d60 <col:3, col:11> x 'int'
> (IntegerLiteral 0x600d90 <col:11> 'int' 0)))
> (BinaryOperator 0x600e48 <line:5:3, col:13> 'int' lvalue ','
> (UnaryOperator 0x600dd8 <col:3, col:4> 'int' postfix '++'
> (DeclRefExpr 0x600dc0 <col:3> 'int' lvalue Var 0x600d60 'x' 'int'))
> (CompoundAssignOperator 0x600e28 <col:8, col:13> 'int' lvalue
> '+=' ComputeLHSTy='int' ComputeResultTy='int'
> (DeclRefExpr 0x600dec <col:8> 'int' lvalue Var 0x600d60 'x' 'int')
> (IntegerLiteral 0x600e08 <col:13> 'int' 1)))
> (ForStmt 0x601028 <line:7:3, line:8:5>
> (DeclStmt 0x600f30 <line:7:8, col:24>
> (VarDecl 0x600e70 <col:8, col:16> x 'int'
> (IntegerLiteral 0x600ea0 <col:16> 'int' 0))
> (VarDecl 0x600ed0 <col:8, col:23> y 'int'
> (IntegerLiteral 0x600f00 <col:23> 'int' 0)))
> (<<<NULL>>>)
> (BinaryOperator 0x600f88 <col:26, col:30> '_Bool' '<'
> (ImplicitCastExpr 0x600f78 <col:26> 'int' <LValueToRValue>
> (DeclRefExpr 0x600f40 <col:26> 'int' lvalue Var 0x600e70 'x' 'int'))
> (IntegerLiteral 0x600f58 <col:30> 'int' 10))
> (BinaryOperator 0x601000 <col:34, col:41> 'int' lvalue ','
> (UnaryOperator 0x600fb8 <col:34, col:36> 'int' lvalue prefix '++'
> (DeclRefExpr 0x600fa0 <col:36> 'int' lvalue Var 0x600e70 'x' 'int'))
> (UnaryOperator 0x600fe8 <col:39, col:41> 'int' lvalue prefix '--'
> (DeclRefExpr 0x600fcc <col:41> 'int' lvalue Var 0x600ed0
> 'y' 'int')))
> (NullStmt 0x601018 <line:8:5>)))))
> --
>
> It doesn't look like the comma in the for statement declaration is
> represented in the AST, but maybe you can trigger on the fact that
> there are multiple VarDecls under the DeclStmt?
Commas in declarations aren't the same as comma operators in
expressions. If you declare x and y outside of the for statement, then
you will see the comma in the AST.
> (ForStmt 0x601028 <line:7:3, line:8:5>
> (DeclStmt 0x600f30 <line:7:8, col:24>
> (VarDecl 0x600e70 <col:8, col:16> x 'int'
> (IntegerLiteral 0x600ea0 <col:16> 'int' 0))
> (VarDecl 0x600ed0 <col:8, col:23> y 'int'
> (IntegerLiteral 0x600f00 <col:23> 'int' 0)))
>
> - Kim
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
More information about the cfe-dev
mailing list