Hello everyone,
Why is it that the following matcher
cxxRecordDecl(has(unless(cxxRecordDecl())))
works in clang-query, but when copied to to a .cpp file, it won’t compile the matcher:
…/lib/UsingAnalysis.cpp:46:29: error: no matching function for call to object of type ‘const internal::ArgumentAdaptingMatcherFuncinternal::HasMatcher’
auto m = cxxRecordDecl(has(unless(cxxRecordDecl())));
^~~
/usr/local/include/clang/ASTMatchers/ASTMatchersInternal.h:1183:3: note: candidate template ignored: could not match ‘Matcher’ against ‘VariadicOperatorMatcher’
operator()(const Matcher &InnerMatcher) const {
Tried on macOS 10.13 & Ubuntu 20.04 with LLVM 11.0.0.
Best,
Siegfried
A minimal code sample to trigger the error:
#include “clang/ASTMatchers/ASTMatchers.h”
using namespace clang::ast_matchers;
int main(int argc, char** argv){
auto m = cxxRecordDecl(has(unless(cxxRecordDecl())));
return 0;
}
Best, Siegfried
clang-query parsing is less strict than the c++ language, so there are probably a few of these differences.
I assume you realize that you should instead use either
unless(has())
or
has(decl(unless(cxxRecordDecl())))
depending on what you are trying to achieve?
Hi, thanks for your answer!
Your second matcher proposal captures the right behavior: I want to match
declarations that are of any kind but that specific one.
On the internet I read to use clang-query to prototype matchers, so I was pretty surprised
that it didn’t work when I copied it over.
Best,
Siegfried