diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -1750,6 +1750,20 @@ +
Matches C++17 deduced template specialization types, e.g. deduced class +template types. + +Given + template <typename T> + class C { public: C(T); }; + + C c(123); +deducedTemplateSpecializationType() matches the type in the declaration +of the variable c. +
Matches C++ arrays whose size is a value-dependent expression. @@ -3522,7 +3536,7 @@
Matches NamedDecl nodes that have the specified name. Supports specifying enclosing namespaces or classes by prefixing the name diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -6030,6 +6030,21 @@ extern const AstTypeMatchertemplateSpecializationType; +/// Matches C++17 deduced template specialization types, e.g. deduced class +/// template types. +/// +/// Given +/// \code +/// template +/// class C { public: C(T); }; +/// +/// C c(123); +/// \endcode +/// \c deducedTemplateSpecializationType() matches the type in the declaration +/// of the variable \c c. +extern const AstTypeMatcher + deducedTemplateSpecializationType; + /// Matches types nodes representing unary type transformations. /// /// Given: diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -202,6 +202,7 @@ REGISTER_MATCHER(declStmt); REGISTER_MATCHER(declaratorDecl); REGISTER_MATCHER(decltypeType); + REGISTER_MATCHER(deducedTemplateSpecializationType); REGISTER_MATCHER(defaultStmt); REGISTER_MATCHER(dependentSizedArrayType); REGISTER_MATCHER(designatedInitExpr); diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1458,6 +1458,12 @@ templateSpecializationType())); } +TEST(TypeMatching, MatchesDeucedTemplateSpecializationType) { + EXPECT_TRUE(matches("template class A{ public: A(T) {} }; A a(1);", + deducedTemplateSpecializationType(), + LanguageMode::Cxx17OrLater)); +} + TEST(TypeMatching, MatchesRecordType) { EXPECT_TRUE(matches("class C{}; C c;", recordType())); EXPECT_TRUE(matches("struct S{}; S s;",