[llvm-dev] Looking for help with an ast matcher

Mads Ravn via llvm-dev llvm-dev at lists.llvm.org
Mon Nov 28 00:06:32 PST 2016


Hi Piotr,

I think I found a working matcher: match
ifStmt(hasCondition(implicitCastExpr(hasImplicitDestinationType(isInteger()),
has(cxxMemberCallExpr(callee(cxxMethodDecl(hasName("compare"))),
hasArgument(0, declRefExpr().bind("str2")),
callee(memberExpr(has(declRefExpr().bind("str1"))))))))).bind("case1")

This one bind to both str1 and str2 in str1.compare(str2). I have included
a code segment below. I have attached a screenshot of this matcher working
from clang-query.
HOWEVER - when I try to use the matcher in clang-tidy it will not work. It
is because of the callee(memberExpr(has(declRefExpr().bind("str1")))) part
of the matcher. If I remove that, I can match on the str1.compare(str2)
from the code. But I need to bind str1 as well to test if it is a string.

Do you  have any idea why a matcher would work in clang-query, but not in
clang-tidy? It's the same piece of code it is working on. Is there
something wrong with my matcher (undefined behavior or something)?

Code:
#include <iostream>
#include <string>

int main() {
    std::string str1{"aa"};
    std::string str2{"bb"};

    if(str1.compare(str2)) {
        std::cout << "Strings not equal" << std::endl;
    }

    return 0;

}




On Sun, Nov 27, 2016 at 10:39 PM Piotr Padlewski <piotr.padlewski at gmail.com>
wrote:

> Sorry for writing 3 emails,
> I looked into http://clang.llvm.org/docs/LibASTMatchersReference.html?
> and it seems that matcher
> on :
> Matcher<CXXMemberCallExpr
> <http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html>> ->
> Matcher<Expr <http://clang.llvm.org/doxygen/classclang_1_1Expr.html>>
> InnerMatcher
> would be my candidate to check. If it won't gonna work then send the test
> and AST dump and I will try to help.
>
> Piotr
>
> 2016-11-27 22:35 GMT+01:00 Piotr Padlewski <piotr.padlewski at gmail.com>:
>
> Adding cfe-dev, because it is related to clang, not LLVM.
>
> 2016-11-27 22:34 GMT+01:00 Piotr Padlewski <piotr.padlewski at gmail.com>:
>
> Hi Mads,
> Can you provide the code that you run clang-query on, or at least AST for
> the fragment you want to match?
>
> Piotr
>
> 2016-11-26 22:27 GMT+01:00 Mads Ravn via llvm-dev <llvm-dev at lists.llvm.org
> >:
>
> Hi,
>
> Hope this is the right channel for this question. I am trying to make an
> ast matcher for clang-tidy to find str1.compare(str2), where both str1 and
> str2 are std::string. I have this so far: http://i.imgur.com/sUma9WC.png .
> But I am having a hard time finding a way to bind an id to the str1 part of
> the expression.
>
> Can anyone help me out with an idea?
>
> Best regards,
> Mads Ravn
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161128/08fdbb2d/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: clang-tidy.png
Type: image/png
Size: 5508 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161128/08fdbb2d/attachment.png>


More information about the llvm-dev mailing list