[clang] 38e1c59 - [clang] adds `conceptDecl` as an ASTMatcher
Christopher Di Bella via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 20 16:34:10 PDT 2023
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;
More information about the cfe-commits
mailing list