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’
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::BindableMatcherclang::Decl’ to 'const
clang::ast_matchers::internal::Matcherclang::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::BindableMatcherclang::Decl’ to
‘ArrayRef<clang::ast_matchers::internal::Matcherclang::Stmt >’ for 1st argument
ResultT operator()(ArrayRef 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