[cfe-dev] Matcher with expressions

Manuel Klimek klimek at google.com
Fri Sep 27 03:13:38 PDT 2013


On Fri, Sep 27, 2013 at 11:57 AM, Pedro Delgado Perez <
pedro.delgadoperez at mail.uca.es> wrote:

>  Thanks a lot, Manuel. It looks great, but unfortunately, I can't test it
> as my clang version doesn't recognize equalsBoundNode... I have to solve
> this problem as my system is not able to identify lots of the matchers in
> the reference...
>
Don't use released clang versions, use svn head...


> Regards,
>
> Pedro.
>
> *El día 27 sep 2013 08:33, Manuel Klimek <klimek at google.com> escribió:*
>
> Something like (untested):
>
> constructExpr(hasDeclaration(methodDecl(ofClass(recordDecl().bind("constructedType")))),
> hasAncestor(methodDecl(ofClass(recordDecl(isDerivedFrom(equalsBoundNode("constructedType"))))))).bind("constructExpr")
> Cheers,
> /Manuel
>
>
> On Thu, Sep 26, 2013 at 11:40 AM, Pedro Delgado Perez <
> pedro.delgado at uca.es> wrote:
>
>> I'm not sure what the question is. You do not want definitions of what?
>>
>> What I need is to find every call to a parent class constructor.
>> Regarding the example I put, I want to match the invokation "A()" and I'm
>> pretty lost in this case...
>>
>> Use hasType to match on the type of an expression.
>>
>> Ok, that's good. But, I don't know how could I express that the type is a
>> constructorDecl from a parent class...
>>
>> Thanks,
>>
>> Pedro.
>>
>> *El día 26 sep 2013 11:19, Manuel Klimek <klimek at google.com> escribió:*
>>
>> On Thu, Sep 26, 2013 at 9:26 AM, Pedro Delgado Perez <
>> pedro.delgadoperez at mail.uca.es> wrote:
>>
>>> Hello,
>>>
>>> Sorry to write you directly, but I have been sending this message since
>>> two days ago to cfe-dev but my message is not posted and I need help as
>>> soon as possible.
>>>
>>> This is the message:
>>>
>>> "Up to now, I have been using matchers to match declarations, but now, I
>>> need to match an expression and I am having some problems.
>>> I am looking for a CXXConstructExpr like the one marked in bold in the
>>> next example:
>>> class A{
>>>    A() {...}
>>>    ...
>>> };
>>> class B: public A{
>>>      B () {* A (); *}
>>> }
>>> I think the matcher should follow this structure:
>>> StatementMatcher CE = constructExpr(...);
>>>
>>> Then:
>>>
>>> 1. If I put nothing within the parentheses, "A()" in class A, "B()" and
>>> "A()" in class B are all retrieved. Therefore, I need to indicate that I do
>>> not want the definitions. Thus, I thought about the matcher "isDefinition",
>>> but it is only for the type "Decl", how can I solve this problem?
>>> The only thing that I have found is the matcher "hasDeclaration", but I
>>> do not know how this matcher could help me in this task.
>>>
>> I'm not sure what the question is. You do not want definitions of what?
>>
>>> 2. I also need to ensure that the constructor invoked belongs to a
>>> parent class. In the same way, when matching declarations I can ask if the
>>> CXXConstructDecl "B()" is "ofClass(recordDecl(isDerivedFrom(...)))". But,
>>> with an expression...
>>>
>> Use hasType to match on the type of an expression.
>> Cheers,
>> /Manuel
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130927/4b55c0c2/attachment.html>


More information about the cfe-dev mailing list