[cfe-dev] ASTMatcher CXXOperatorCallExpr

Shereen shereent7 at gmail.com
Mon Aug 19 11:12:25 PDT 2013


Hi Gabor,

thanks a lot!

So the operator[] call is transformed to a binary function with the object
as the first argument. That makes sense. Interestingly I tried
has(declRefExpr(...)) before but didn't got a match. Tried it again and now
it is working. Must have had a different problem before and thought it was
caused by the has(declRefExpr(...)).

-Shereen


Gábor Kozár wrote
> Hi,
> 
> You probably want something like this:
> 
> operatorCallExpr(hasArgument(declRefExpr(to(varDecl().bind("varName")))),
> hasOverloadedOperatorName("[]"));
> 
> Writing x(y()) in a matcher expression means that the matched node should
> satisfy x() and it should also satisfy y(). So what you were writing (
> operatorCallExpr(declRefExpr(...))) would have required a node to be both
> a
> CXXOperatorCallExpr and a DeclRefExpr.
> 
> You should also make sure that this does not match on a call like this:
> y[x]
> Here "y" should be matched, not "x". I _think_ that the above matcher
> expression will produce the desired output for this, because I guess the
> reference to "y" will be earlier among the parameters than "x", but you
> need to verify this.
> 
> Hope this helps!
> 
> Gabor
> 
> 
> 2013/8/19 Shereen <

> shereent7@

> >
> 
>> Hi,
>>
>> I'm having trouble writing an ASTMatcher for vector like class access.
>> Matching CXXMemberCallExpr works fine and I can extract all the
>> information I need like the object name etc.
>>
>> Unfortunately I haven't found a way yet to do this for
>> CXXOperatorCallExpr. If I have the following class, is there any way to
>> write a matcher which matches the call to x[1 + 1] and binds x?
>>
>> ----------------------------------------------
>> struct X {
>>   int operator[](int x) { return x; }
>> };
>>
>> X x;
>> int y = x[1 + 1];
>> ----------------------------------------------
>>
>> I tried something along the lines
>>
>> ------------------------------------------------------------
>> operatorCallExpr(declRefExpr(to(varDecl().bind("varName"))),
>>                  hasOverloadedOperatorName("[]"));
>> ------------------------------------------------------------
>>
>> as the ast contains the declRefExpr to the object
>>
>>
>> --------------------------------------------------------------------------------------
>> CXXOperatorCallExpr 0x2dc41c0 <col:9, col:14> 'int'
>>     |-ImplicitCastExpr 0x2dc41a8 <col:10, col:14> 'int (*)(int)'
>> 
> <FunctionToPointerDecay>
>>     | `-DeclRefExpr 0x2dc4158 <col:10, col:14> 'int (int)' lvalue
>> CXXMethod
>> 0x2d92660 'operator[]' 'int (int)'
>>     |-DeclRefExpr 0x2dc40c8 
> <col:9>
>  'struct X' lvalue Var 0x2dc3c90 'x'
>> 'struct X'
>>     `-BinaryOperator 0x2dc4130 <col:11, col:13> 'int' '+'
>>       |-IntegerLiteral 0x2dc40f0 
> <col:11>
>  'int' 1
>>       `-IntegerLiteral 0x2dc4110 
> <col:13>
>  'int' 1
>>
>> --------------------------------------------------------------------------------------
>>
>> bit this doesn't match. Calling getCalleeDecl() on the
>> CXXOperatorCallExpr also just returns "operator[]".
>>
>> Is there any other way to get the name of the object operator[] is called
>> on?
>>
>> Kind regards,
>> Shereen
>>
>>
>>
>> --
>> View this message in context:
>> http://clang-developers.42468.n3.nabble.com/ASTMatcher-CXXOperatorCallExpr-tp4033959.html
>> Sent from the Clang Developers mailing list archive at Nabble.com.
>> _______________________________________________
>> cfe-dev mailing list
>> 

> cfe-dev at .uiuc

>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
> 
> _______________________________________________
> cfe-dev mailing list

> cfe-dev at .uiuc

> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev





--
View this message in context: http://clang-developers.42468.n3.nabble.com/ASTMatcher-CXXOperatorCallExpr-tp4033959p4033970.html
Sent from the Clang Developers mailing list archive at Nabble.com.




More information about the cfe-dev mailing list