Учитывая шаблон функции, такой как:
template <typename T> void function(T &&t) { /*...*/ }
как мне найти вызовы функции, которые передают значения rvalue:
function(1); // MATCH
int i;
function(i); // SKIP
int foo();
function(foo()); // MATCH
...
Вы поняли идею.
Я думал о чем-то вроде:
callExpr(callee(functionDecl(
hasName("function"),
unless(hasTemplateArgument(0,
refersToType(references(anything()))))))
чтобы отфильтровать случай, когда T
выводится как ссылочный тип (указывая, что было передано lvalue), но я не понимаю, как я могу связать Matcher<FunctionDecl>
, ожидаемый functionDecl
, с Matcher<TemplateSpecializationType>
, возвращенным из hasTemplateArgument
.
Я использую Clang 3.8, если это имеет значение (онлайн-документы кажутся в версии 5.0.0 и http://releases.llvm.org/3.8.0/tools/clang/docs/LibASTMatchersReference.html дает ошибку 404).