llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Amr Hesham (AmrDeveloper) <details> <summary>Changes</summary> Add AST Matcher for `DependentScopeDeclRefExpr` Fixes: #<!-- -->120937 --- Full diff: https://github.com/llvm/llvm-project/pull/120996.diff 7 Files Affected: - (modified) clang/docs/LibASTMatchersReference.html (+6) - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/include/clang/ASTMatchers/ASTMatchers.h (+9) - (modified) clang/lib/ASTMatchers/ASTMatchersInternal.cpp (+1) - (modified) clang/lib/ASTMatchers/Dynamic/Registry.cpp (+1) - (modified) clang/unittests/AST/ASTImporterTest.cpp (-3) - (modified) clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp (+18-3) ``````````diff diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index f18e9cf1341696..ddc99020604c94 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -1842,6 +1842,12 @@ <h2 id="decl-matchers">Node Matchers</h2> if (x) {} </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('dependentScopeDeclRefExpr0')"><a name="dependentScopeDeclRefExpr0Anchor">dependentScopeDeclRefExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentScopeDeclRefExpr.html">DependentScopeDeclRefExpr</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="dependentScopeDeclRefExpr0"><pre>Matches expressions that refer to dependent scope declarations. + +Example matches T::v + template <class T> class X : T { void f() { T::v; } }; +</pre></td></tr> <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>>...</td></tr> <tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 8b984ecaefecaf..2a84a4704f0c21 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -1101,6 +1101,8 @@ AST Matchers - Ensure ``pointee`` matches Objective-C pointer types. +- Add ``dependentScopeDeclRefExpr`` matcher to match expressions that refer to dependent scope declarations. + clang-format ------------ diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 897aa25dc95cc1..fd8d9c99eca163 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -2125,6 +2125,15 @@ extern const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr; extern const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr; +/// Matches expressions that refer to dependent scope declarations. +/// +/// example matches T::v; +/// \code +/// template <class T> class X : T { void f() { T::v; } }; +/// \endcode +extern const internal::VariadicDynCastAllOfMatcher<Stmt, DependentScopeDeclRefExpr> + dependentScopeDeclRefExpr; + /// Matches a reference to an ObjCIvar. /// /// Example: matches "a" in "init" method: diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index bf9dc5f2373f9e..ebe30f97b08268 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -924,6 +924,7 @@ const internal::VariadicDynCastAllOfMatcher<Stmt, CXXRewrittenBinaryOperator> const internal::VariadicDynCastAllOfMatcher<Stmt, CXXFoldExpr> cxxFoldExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, Expr> expr; const internal::VariadicDynCastAllOfMatcher<Stmt, DeclRefExpr> declRefExpr; +const internal::VariadicDynCastAllOfMatcher<Stmt, DependentScopeDeclRefExpr> dependentScopeDeclRefExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, ObjCIvarRefExpr> objcIvarRefExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, BlockExpr> blockExpr; const internal::VariadicDynCastAllOfMatcher<Stmt, IfStmt> ifStmt; diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 837633fb2f0601..685d626d2978bf 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -222,6 +222,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(decompositionDecl); REGISTER_MATCHER(declCountIs); REGISTER_MATCHER(declRefExpr); + REGISTER_MATCHER(dependentScopeDeclRefExpr); REGISTER_MATCHER(declStmt); REGISTER_MATCHER(declaratorDecl); REGISTER_MATCHER(decltypeType); diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index f3f314b723dfc6..ec062a5cc953b8 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -3172,9 +3172,6 @@ TEST_P(ImportDecl, ImportFieldOrder) { recordDecl(hasFieldOrder({"b", "a"}))); } -const internal::VariadicDynCastAllOfMatcher<Expr, DependentScopeDeclRefExpr> - dependentScopeDeclRefExpr; - TEST_P(ImportExpr, DependentScopeDeclRefExpr) { MatchVerifier<Decl> Verifier; testImport("template <typename T> struct S { static T foo; };" diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index 9bc287e07224aa..0663cc35d7a52a 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -556,6 +556,22 @@ TEST_P(ASTMatchersTest, DeclRefExpr) { Reference)); } +TEST_P(ASTMatchersTest, DependentScopeDeclRefExpr) { + if (!GetParam().isCXX()) { + // FIXME: Add a test for `dependentScopeDeclRefExpr()` that does not depend on C++. + return; + } + + EXPECT_TRUE( + matches("template <class T> class X : T { void f() { T::v; } };", + dependentScopeDeclRefExpr())); + + EXPECT_TRUE( + matches("template <typename T> struct S { static T Foo; };" + "template <typename T> void declToImport() { (void)S<T>::Foo; }", + dependentScopeDeclRefExpr())); +} + TEST_P(ASTMatchersTest, CXXMemberCallExpr) { if (!GetParam().isCXX()) { return; @@ -629,10 +645,9 @@ TEST_P(ASTMatchersTest, MemberExpr_MatchesVariable) { EXPECT_TRUE(matches("template <class T>" "class X : T { void f() { this->T::v; } };", cxxDependentScopeMemberExpr())); - // FIXME: Add a matcher for DependentScopeDeclRefExpr. EXPECT_TRUE( - notMatches("template <class T> class X : T { void f() { T::v; } };", - cxxDependentScopeMemberExpr())); + matches("template <class T> class X : T { void f() { T::v; } };", + dependentScopeDeclRefExpr())); EXPECT_TRUE(matches("template <class T> void x() { T t; t.v; }", cxxDependentScopeMemberExpr())); } `````````` </details> https://github.com/llvm/llvm-project/pull/120996 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits