[cfe-dev] What's wrong with my AST matcher ?
Alexey Sidorin via cfe-dev
cfe-dev at lists.llvm.org
Fri Jun 29 22:02:59 PDT 2018
Hi Alan,
stmt() is a matcher for statements, but varDecl() is a matcher for
declarations, so varDecl() cannot be used as an argument of stmt()
matcher as-is. You should be more specific and point that you want to
match not just any Stmt but DeclStmt that contains a declaration you
want to match:
return declStmt(containsDeclaration(test));
Alternatively, if you only want to find a declaration, not a statement
that declares it, you can just drop stmt() matcher.
30.06.2018 07:20, Alan Davidson via cfe-dev пишет:
>
> Hi guys,
>
>
> I'm trying to get the hang of AST matching in clang. I need a little
> help needed in understanding the error messages and what's wrong with
> the code here:
>
>
> The intent of this AST matching code is to detect this:
>
>
> int y = X; <-- this should be matched
>
> int r = m; <-- this shouldn't be matched
>
>
> After going through clang/ASTMatchers/ASTMatchers.h, I came up with a
> checker which - minus the boilerplate code - does this:
>
>
> ...
>
> ...
>
> static auto findTest() -> decltype(stmt()) {
>
>
> auto test =
> varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("X")))))));
>
> return stmt(test);
>
> }
>
> ..
>
> ..
>
>
> The compiler is telling me something but I'm unable to figure out
> what's the issue here. Why is it not able to create a stmt instance
> from test ? Also, is the checker logic sane ?
>
>
>
> [ 87%] Built target clangIndex
>
> [ 87%] Built target clangStaticAnalyzerCore
>
> *Scanning dependencies of target clangStaticAnalyzerCheckers*
>
> [ 87%] Building CXX object
> tools/clang/lib/StaticAnalyzer/Checkers/CMakeFiles/clangStaticAnalyzerCheckers.dir/testChecker.cpp.o
>
> */Volumes/LoboElk17E202/Users/local/llvm/tools/clang/lib/StaticAnalyzer/Checkers/testChecker.cpp:40:10:
> **error: **no matching function for*
>
> *call to object of type 'const internal::VariadicAllOfMatcher<Stmt>'*
>
> return stmt(test);
>
> * ^~~~*
>
> */Volumes/LoboElk17E202/Users/local/llvm/tools/clang/include/clang/ASTMatchers/ASTMatchersInternal.h:95:11:
> note: *candidate function not
>
> viable: no known conversion from
> 'clang::ast_matchers::internal::BindableMatcher<clang::Decl>' to 'const
>
> clang::ast_matchers::internal::Matcher<clang::Stmt>' for 1st argument
>
> ResultT operator()(const ArgT &Arg1, const ArgsT &... Args) const {
>
> * ^*
>
> */Volumes/LoboElk17E202/Users/local/llvm/tools/clang/include/clang/ASTMatchers/ASTMatchersInternal.h:101:11:
> note: *candidate function not
>
> viable: no known conversion from
> 'clang::ast_matchers::internal::BindableMatcher<clang::Decl>' to
>
> 'ArrayRef<clang::ast_matchers::internal::Matcher<clang::Stmt> >' for
> 1st argument
>
> ResultT operator()(ArrayRef<ArgT> Args) const {
>
> * ^*
>
> */Volumes/LoboElk17E202/Users/local/llvm/tools/clang/include/clang/ASTMatchers/ASTMatchersInternal.h:92:11:
> note: *candidate function not
>
> viable: requires 0 arguments, but 1 was provided
>
> ResultT operator()() const { return Func(None); }
>
> * ^*
>
> 1 error generated.
>
> make[2]: ***
> [tools/clang/lib/StaticAnalyzer/Checkers/CMakeFiles/clangStaticAnalyzerCheckers.dir/testChecker.cpp.o]
> Error 1
>
> make[1]: ***
> [tools/clang/lib/StaticAnalyzer/Checkers/CMakeFiles/clangStaticAnalyzerCheckers.dir/all]
> Error 2
>
> make: *** [all] Error 2
>
>
>
> Alan
>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180630/ef7fe075/attachment.html>
More information about the cfe-dev
mailing list