Author: Stephen Kelly Date: 2021-02-02T14:23:13Z New Revision: 9e5fc578f99aaa3f01374d3f09fda75fa7d0239e
URL: https://github.com/llvm/llvm-project/commit/9e5fc578f99aaa3f01374d3f09fda75fa7d0239e DIFF: https://github.com/llvm/llvm-project/commit/9e5fc578f99aaa3f01374d3f09fda75fa7d0239e.diff LOG: [ASTMatchers] Ignore parts of BindingDecls which are not spelled in source Differential Revision: https://reviews.llvm.org/D95740 Added: Modified: clang/include/clang/AST/ASTNodeTraverser.h clang/lib/ASTMatchers/ASTMatchFinder.cpp clang/unittests/AST/ASTTraverserTest.cpp clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ASTNodeTraverser.h b/clang/include/clang/AST/ASTNodeTraverser.h index bb5b0c73f028..c4f0355b352e 100644 --- a/clang/include/clang/AST/ASTNodeTraverser.h +++ b/clang/include/clang/AST/ASTNodeTraverser.h @@ -438,6 +438,8 @@ class ASTNodeTraverser } void VisitBindingDecl(const BindingDecl *D) { + if (Traversal == TK_IgnoreUnlessSpelledInSource) + return; if (const auto *E = D->getBinding()) Visit(E); } diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp index 69957a952d17..58e69bb29df6 100644 --- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -1216,6 +1216,8 @@ bool MatchASTVisitor::TraverseDecl(Decl *DeclNode) { ScopedChildren = true; if (FD->isTemplateInstantiation()) ScopedTraversal = true; + } else if (isa<BindingDecl>(DeclNode)) { + ScopedChildren = true; } ASTNodeNotSpelledInSourceScope RAII1(this, ScopedTraversal); diff --git a/clang/unittests/AST/ASTTraverserTest.cpp b/clang/unittests/AST/ASTTraverserTest.cpp index 94b9572ad50d..d633f90b57d2 100644 --- a/clang/unittests/AST/ASTTraverserTest.cpp +++ b/clang/unittests/AST/ASTTraverserTest.cpp @@ -1148,6 +1148,15 @@ void callDefaultArg() { hasDefaultArg(42); } + +void decomposition() +{ + int arr[3]; + auto &[f, s, t] = arr; + + f = 42; +} + )cpp", {"-std=c++20"}); @@ -1443,6 +1452,46 @@ CallExpr CallExpr |-DeclRefExpr 'hasDefaultArg' `-IntegerLiteral +)cpp"); + } + + { + auto FN = ast_matchers::match( + functionDecl(hasName("decomposition"), + hasDescendant(decompositionDecl().bind("decomp"))), + AST2->getASTContext()); + EXPECT_EQ(FN.size(), 1u); + + EXPECT_EQ( + dumpASTString(TK_AsIs, FN[0].getNodeAs<DecompositionDecl>("decomp")), + R"cpp( +DecompositionDecl '' +|-DeclRefExpr 'arr' +|-BindingDecl 'f' +| `-ArraySubscriptExpr +| |-ImplicitCastExpr +| | `-DeclRefExpr '' +| `-IntegerLiteral +|-BindingDecl 's' +| `-ArraySubscriptExpr +| |-ImplicitCastExpr +| | `-DeclRefExpr '' +| `-IntegerLiteral +`-BindingDecl 't' + `-ArraySubscriptExpr + |-ImplicitCastExpr + | `-DeclRefExpr '' + `-IntegerLiteral +)cpp"); + + EXPECT_EQ(dumpASTString(TK_IgnoreUnlessSpelledInSource, + FN[0].getNodeAs<DecompositionDecl>("decomp")), + R"cpp( +DecompositionDecl '' +|-DeclRefExpr 'arr' +|-BindingDecl 'f' +|-BindingDecl 's' +`-BindingDecl 't' )cpp"); } } diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp index 06c2bbc29e5c..b756cf815aaf 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2591,6 +2591,48 @@ B func1() { return 42; } Code, traverse(TK_IgnoreUnlessSpelledInSource, M), std::make_unique<VerifyIdIsBoundTo<Expr>>("allExprs", 1))); } + + Code = R"cpp( +void foo() +{ + int arr[3]; + auto &[f, s, t] = arr; + + f = 42; +} + )cpp"; + { + auto M = bindingDecl(hasName("f")); + EXPECT_TRUE( + matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"})); + EXPECT_TRUE( + matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M), + true, {"-std=c++17"})); + } + { + auto M = bindingDecl(hasName("f"), has(expr())); + EXPECT_TRUE( + matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"})); + EXPECT_FALSE( + matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M), + true, {"-std=c++17"})); + } + { + auto M = integerLiteral(hasAncestor(bindingDecl(hasName("f")))); + EXPECT_TRUE( + matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"})); + EXPECT_FALSE( + matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M), + true, {"-std=c++17"})); + } + { + auto M = declRefExpr(hasAncestor(bindingDecl(hasName("f")))); + EXPECT_TRUE( + matchesConditionally(Code, traverse(TK_AsIs, M), true, {"-std=c++17"})); + EXPECT_FALSE( + matchesConditionally(Code, traverse(TK_IgnoreUnlessSpelledInSource, M), + true, {"-std=c++17"})); + } } TEST(Traversal, traverseNoImplicit) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits