Author: Christopher Di Bella Date: 2023-07-20T23:33:46Z New Revision: 38e1c597033de0c7655abb39335b364408865d2a
URL: https://github.com/llvm/llvm-project/commit/38e1c597033de0c7655abb39335b364408865d2a DIFF: https://github.com/llvm/llvm-project/commit/38e1c597033de0c7655abb39335b364408865d2a.diff LOG: [clang] adds `conceptDecl` as an ASTMatcher Closes #63934 Differential Revision: https://reviews.llvm.org/D155549 Added: Modified: clang/docs/LibASTMatchersReference.html clang/docs/ReleaseNotes.rst clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/ASTMatchersInternal.cpp clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/AST/DeclTest.cpp Removed: ################################################################################ diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index b4f282fbf43816..4f2a1f9508baa2 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -682,6 +682,15 @@ <h2 id="decl-matchers">Node Matchers</h2> </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('conceptDecl0')"><a name="conceptDecl0Anchor">conceptDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ConceptDecl.html">ConceptDecl</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="conceptDecl0"><pre>Matches concept declarations. + +Example matches integral + template<typename T> + concept integral = std::is_integral_v<T>; +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>>...</td></tr> <tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f1d098ef02f41d..bb9daddef8d198 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -262,6 +262,7 @@ Non-comprehensive list of changes in this release - Added ``__builtin_elementwise_nearbyint`` for floating point types. This allows access to ``llvm.nearbyint`` for arbitrary floating-point and vector of floating-point types. +- Clang AST matcher now matches concept declarations with `conceptDecl`. New Compiler Flags ------------------ diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index a9313139226ca4..f49204a3d90626 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -1334,6 +1334,16 @@ extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl> extern const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl> cxxDeductionGuideDecl; +/// Matches concept declarations. +/// +/// Example matches integral +/// \code +/// template<typename T> +/// concept integral = std::is_integral_v<T>; +/// \endcode +extern const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl> + conceptDecl; + /// Matches variable declarations. /// /// Note: this does not match declarations of member variables, which are diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index ad6b20f4fd2ff8..3470467112dd5f 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -800,6 +800,7 @@ const internal::VariadicDynCastAllOfMatcher<Decl, TagDecl> tagDecl; const internal::VariadicDynCastAllOfMatcher<Decl, CXXMethodDecl> cxxMethodDecl; const internal::VariadicDynCastAllOfMatcher<Decl, CXXConversionDecl> cxxConversionDecl; +const internal::VariadicDynCastAllOfMatcher<Decl, ConceptDecl> conceptDecl; const internal::VariadicDynCastAllOfMatcher<Decl, VarDecl> varDecl; const internal::VariadicDynCastAllOfMatcher<Decl, FieldDecl> fieldDecl; const internal::VariadicDynCastAllOfMatcher<Decl, IndirectFieldDecl> diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index d3594455b55a46..1098df032a64b9 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -172,6 +172,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(compoundLiteralExpr); REGISTER_MATCHER(compoundStmt); REGISTER_MATCHER(coawaitExpr); + REGISTER_MATCHER(conceptDecl); REGISTER_MATCHER(conditionalOperator); REGISTER_MATCHER(constantArrayType); REGISTER_MATCHER(constantExpr); diff --git a/clang/unittests/AST/DeclTest.cpp b/clang/unittests/AST/DeclTest.cpp index 463f35c1cd08b7..54a1f2c5843548 100644 --- a/clang/unittests/AST/DeclTest.cpp +++ b/clang/unittests/AST/DeclTest.cpp @@ -12,9 +12,11 @@ #include "clang/AST/Decl.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DeclTemplate.h" #include "clang/AST/Mangle.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" +#include "clang/Basic/Diagnostic.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/TargetInfo.h" #include "clang/Lex/Lexer.h" @@ -140,6 +142,22 @@ TEST(Decl, MangleDependentSizedArray) { ASSERT_TRUE(0 == MangleB.compare("_ZTSAT0__T_")); } +TEST(Decl, ConceptDecl) { + llvm::StringRef Code(R"( + template<class T> + concept integral = __is_integral(T); + )"); + + auto AST = tooling::buildASTFromCodeWithArgs(Code, {"-std=c++20"}); + ASTContext &Ctx = AST->getASTContext(); + SourceManager &SM = Ctx.getSourceManager(); + + const auto *Decl = + selectFirst<ConceptDecl>("decl", match(conceptDecl().bind("decl"), Ctx)); + ASSERT_TRUE(Decl != nullptr); + EXPECT_EQ(Decl->getName(), "integral"); +} + TEST(Decl, EnumDeclRange) { llvm::Annotations Code(R"( typedef int Foo; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits