https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/120996
>From a0b71504fa31e55d42cb54e349838b2669f6fde5 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Mon, 23 Dec 2024 19:42:30 +0100 Subject: [PATCH 1/2] [Clang][ASTMatcher] Add `dependentScopeDeclRefExpr` Matcher --- clang/docs/LibASTMatchersReference.html | 6 +++++ clang/docs/ReleaseNotes.rst | 2 ++ clang/include/clang/ASTMatchers/ASTMatchers.h | 10 +++++++++ clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 2 ++ clang/lib/ASTMatchers/Dynamic/Registry.cpp | 1 + clang/unittests/AST/ASTImporterTest.cpp | 3 --- .../ASTMatchers/ASTMatchersNodeTest.cpp | 22 +++++++++++++++---- 7 files changed, 39 insertions(+), 7 deletions(-) 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..22e2546ab81e0a 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -2125,6 +2125,16 @@ 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..8c744eebbdfb50 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -924,6 +924,8 @@ 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..89897f1b3230a6 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() || GetParam().hasDelayedTemplateParsing()) { + // 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,8 @@ 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())); + EXPECT_TRUE(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())); } >From 490b09dd950713b4879bab90f71359279867d0b9 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Tue, 24 Dec 2024 11:08:12 +0100 Subject: [PATCH 2/2] Update Fixme comment --- clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index 89897f1b3230a6..a3baad367a27b1 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -558,8 +558,7 @@ TEST_P(ASTMatchersTest, DeclRefExpr) { TEST_P(ASTMatchersTest, DependentScopeDeclRefExpr) { if (!GetParam().isCXX() || GetParam().hasDelayedTemplateParsing()) { - // FIXME: Add a test for `dependentScopeDeclRefExpr()` that does not depend - // on C++. + // FIXME: Fix this test to work with delayed template parsing. return; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits