[cfe-dev] AST visiting and DeclRefExpr

Sam Parker S.Parker3 at lboro.ac.uk
Fri Oct 18 06:56:32 PDT 2013


Hi,

I'm playing with a recursive AST, and I want to visit all the 
DeclRefExprs and record them. I have been able to do this successfully, 
by overloading VisitDeclRefExpr, except for this section:

bool isValid = IN_RANGE(tx, validXmin, validXmax);

if (isValid)
     validBuffer[get_global_id(0)] = true;

Where the AST looks like this:

(DeclStmt 0x5003680 <line:67:2, col:51>
     (0x5003410 "bool isValid =
       (ParenExpr 0x5003660 <line:1:31, col:56> '_Bool'
         (BinaryOperator 0x5003638 <col:32, col:55> '_Bool' '&&'
           (BinaryOperator 0x5003528 <col:32, col:41> '_Bool' '>='
             (ImplicitCastExpr 0x50034f8 <col:32, col:34> 'int' 
<LValueToRValue>
               (ParenExpr 0x5003490 <col:32, col:34> 'int' lvalue
                 (DeclRefExpr 0x5003468 <line:67:26> 'int' lvalue Var 
0x5002000 'tx' 'int')))
             (ImplicitCastExpr 0x5003510 <line:1:37, col:41> 'int' 
<LValueToRValue>
               (ParenExpr 0x50034d8 <col:37, col:41> 'int' lvalue
                 (DeclRefExpr 0x50034b0 <line:67:30> 'int' lvalue Var 
0x5002860 'validXmin' 'int'))))
           (BinaryOperator 0x5003610 <line:1:46, col:55> '_Bool' '<='
             (ImplicitCastExpr 0x50035e0 <col:46, col:48> 'int' 
<LValueToRValue>
               (ParenExpr 0x5003578 <col:46, col:48> 'int' lvalue
                 (DeclRefExpr 0x5003550 <line:67:26> 'int' lvalue Var 
0x5002000 'tx' 'int')))
             (ImplicitCastExpr 0x50035f8 <line:1:51, col:55> 'int' 
<LValueToRValue>
               (ParenExpr 0x50035c0 <col:51, col:55> 'int' lvalue
                 (DeclRefExpr 0x5003598 <line:67:41> 'int' lvalue Var 
0x5002a40 'validXmax' 'int'))))))"))
   (IfStmt 0x5003868 <line:69:2, line:70:35>
     (<<<NULL>>>)
     (ImplicitCastExpr 0x50036c0 <line:69:6> '_Bool' <LValueToRValue>
       (DeclRefExpr 0x5003698 <col:6> '_Bool' lvalue Var 0x5003410 
'isValid' '_Bool'))
     (BinaryOperator 0x5003840 <line:70:3, col:35> '_Bool' lvalue '='
       (ArraySubscriptExpr 0x5003800 <col:3, col:31> '_Bool' lvalue
         (ImplicitCastExpr 0x50037e8 <col:3> '_Bool *' <LValueToRValue>
           (DeclRefExpr 0x50036d8 <col:3> '_Bool *' lvalue ParmVar 
0x5001940 'validBuffer' '_Bool *'))
         (CallExpr 0x50037b8 <col:15, col:30> 'int'
           (ImplicitCastExpr 0x50037a0 <col:15> 'int (*)(int)' 
<FunctionToPointerDecay>
             (DeclRefExpr 0x5003778 <col:15> 'int (int)' lvalue Function 
0x5000d90 'get_global_id' 'int (int)'))
           (IntegerLiteral 0x5003758 <col:29> 'int' 0)))
       (CXXBoolLiteralExpr 0x5003828 <col:35> '_Bool' true))
     (<<<NULL>>>))

My problem is that isValid in the if condition is not visited here. 
isValid is visited if i use a variable to store the result from 
get_global_id and use it to id the array, what is the reason for this?

Many thanks,
Sam

-- 
Sam Parker
Research Student
Electronic Systems Design Group
School of Electronic and Systems Engineering
Loughborough University
UK




More information about the cfe-dev mailing list