Piotr Padlewski via llvm-dev
2016-Nov-27 21:35 UTC
[llvm-dev] Looking for help with an ast matcher
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/20161127/f1a2bf1d/attachment.html>
Piotr Padlewski via llvm-dev
2016-Nov-27 21:39 UTC
[llvm-dev] Looking for help with an ast matcher
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/20161127/58fa2545/attachment.html>
Mads Ravn via llvm-dev
2016-Nov-28 08:06 UTC
[llvm-dev] Looking for help with an ast matcher
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>