Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -2843,18 +2843,13 @@ /// matches x(1, y, 42) /// with hasAnyArgument(...) /// matching y -/// -/// FIXME: Currently this will ignore parentheses and implicit casts on -/// the argument before applying the inner matcher. We'll want to remove -/// this to allow for greater control by the user once \c ignoreImplicit() -/// has been implemented. AST_POLYMORPHIC_MATCHER_P(hasAnyArgument, AST_POLYMORPHIC_SUPPORTED_TYPES(CallExpr, CXXConstructExpr), internal::Matcher, InnerMatcher) { for (const Expr *Arg : Node.arguments()) { BoundNodesTreeBuilder Result(*Builder); - if (InnerMatcher.matches(*Arg->IgnoreParenImpCasts(), Finder, &Result)) { + if (InnerMatcher.matches(*Arg, Finder, &Result)) { *Builder = std::move(Result); return true; } @@ -4792,6 +4787,26 @@ return false; } +/// \brief Matches the return value expression of a return statement +/// +/// Given +/// \code +/// return a+b; +/// \endcode +/// hasReturnValue(binaryOperator()) +/// matches 'return a+b' +/// with binaryOperator() +/// matching 'a+b' +AST_MATCHER_P(ReturnStmt, hasReturnValue, internal::Matcher, InnerMatcher) { + BoundNodesTreeBuilder Result(*Builder); + if(InnerMatcher.matches(*Node.getRetValue(), Finder, &Result)) { + *Builder = std::move(Result); + return true; + } + return false; +} + + /// \brief Matches CUDA kernel call expression. /// /// Example matches,