diff --git a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h --- a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h +++ b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h @@ -1443,6 +1443,13 @@ operator()(const Matcher &InnerMatcher) const { return create(InnerMatcher); } + + template + ArgumentAdaptingMatcherFuncAdaptor::Type, ToTypes> + operator()(const MapAnyOfHelper &InnerMatcher) const { + return create(InnerMatcher.with()); + } }; template class TraversalMatcher : public MatcherInterface { diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -491,6 +491,17 @@ Code, traverse(TK_IgnoreUnlessSpelledInSource, mapAnyOf(ifStmt, forStmt).with(hasCondition(falseExpr))))); + EXPECT_TRUE( + matches(Code, cxxBoolLiteral(equals(true), + hasAncestor(mapAnyOf(ifStmt, forStmt))))); + + EXPECT_TRUE( + matches(Code, cxxBoolLiteral(equals(false), + hasAncestor(mapAnyOf(ifStmt, forStmt))))); + + EXPECT_TRUE( + notMatches(Code, floatLiteral(hasAncestor(mapAnyOf(ifStmt, forStmt))))); + Code = R"cpp( void func(bool b) {} struct S {