steveire created this revision. steveire added a reviewer: aaron.ballman. steveire requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
A callExpr whose argument is dependent has a null getCalleeDecl(). Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D93324 Files: clang/include/clang/ASTMatchers/ASTMatchersInternal.h clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -1942,6 +1942,18 @@ matches(Code, callExpr(traverse(TK_IgnoreUnlessSpelledInSource, hasAnyArgument(floatLiteral()))))); + EXPECT_TRUE(matches( + R"cpp( +void takesBool(bool){} + +template <typename T> +void neverInstantiatedTemplate() { + takesBool(T{}); +} +)cpp", + traverse(TK_IgnoreUnlessSpelledInSource, + callExpr(unless(callExpr(hasDeclaration(functionDecl()))))))); + EXPECT_TRUE( matches(VarDeclCode, varDecl(traverse(TK_IgnoreUnlessSpelledInSource, hasType(builtinType()))))); Index: clang/include/clang/ASTMatchers/ASTMatchersInternal.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchersInternal.h +++ clang/include/clang/ASTMatchers/ASTMatchersInternal.h @@ -1064,10 +1064,11 @@ /// is \c NULL. bool matchesDecl(const Decl *Node, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) const { - if (Finder->isTraversalIgnoringImplicitNodes() && Node->isImplicit()) - return false; - return Node != nullptr && this->InnerMatcher.matches( - DynTypedNode::create(*Node), Finder, Builder); + return Node != nullptr && + !(Finder->isTraversalIgnoringImplicitNodes() && + Node->isImplicit()) && + this->InnerMatcher.matches(DynTypedNode::create(*Node), Finder, + Builder); } };
Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -1942,6 +1942,18 @@ matches(Code, callExpr(traverse(TK_IgnoreUnlessSpelledInSource, hasAnyArgument(floatLiteral()))))); + EXPECT_TRUE(matches( + R"cpp( +void takesBool(bool){} + +template <typename T> +void neverInstantiatedTemplate() { + takesBool(T{}); +} +)cpp", + traverse(TK_IgnoreUnlessSpelledInSource, + callExpr(unless(callExpr(hasDeclaration(functionDecl()))))))); + EXPECT_TRUE( matches(VarDeclCode, varDecl(traverse(TK_IgnoreUnlessSpelledInSource, hasType(builtinType()))))); Index: clang/include/clang/ASTMatchers/ASTMatchersInternal.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchersInternal.h +++ clang/include/clang/ASTMatchers/ASTMatchersInternal.h @@ -1064,10 +1064,11 @@ /// is \c NULL. bool matchesDecl(const Decl *Node, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) const { - if (Finder->isTraversalIgnoringImplicitNodes() && Node->isImplicit()) - return false; - return Node != nullptr && this->InnerMatcher.matches( - DynTypedNode::create(*Node), Finder, Builder); + return Node != nullptr && + !(Finder->isTraversalIgnoringImplicitNodes() && + Node->isImplicit()) && + this->InnerMatcher.matches(DynTypedNode::create(*Node), Finder, + Builder); } };
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits