Skip to content

Commit d85b22e

Browse files
authored
[Clang][ASTMatcher] Add dependentTemplateSpecializationType matcher (#121435)
Fixes #121307
1 parent 18b4737 commit d85b22e

File tree

7 files changed

+43
-4
lines changed

7 files changed

+43
-4
lines changed

clang/docs/LibASTMatchersReference.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2546,6 +2546,17 @@ <h2 id="decl-matchers">Node Matchers</h2>
25462546
};
25472547
</pre></td></tr>
25482548

2549+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentTemplateSpecializationType0')"><a name="dependentTemplateSpecializationType0Anchor">dependentTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentTemplateSpecializationType.html">DependentTemplateSpecializationType</a>&gt;...</td></tr>
2550+
<tr><td colspan="4" class="doc" id="dependentTemplateSpecializationType0"><pre>Matches a dependent template specialization type.
2551+
2552+
Example matches A<T>::template B<T>
2553+
2554+
template<typename T> struct A;
2555+
template<typename T> struct declToImport {
2556+
typename A<T>::template B<T> a;
2557+
};
2558+
</pre></td></tr>
2559+
25492560
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
25502561
<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
25512562
template types.

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,8 @@ AST Matchers
11141114

11151115
- Add ``dependentNameType`` matcher to match a dependent name type.
11161116

1117+
- Add ``dependentTemplateSpecializationType`` matcher to match a dependent template specialization type.
1118+
11171119
clang-format
11181120
------------
11191121

clang/include/clang/ASTMatchers/ASTMatchers.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7721,6 +7721,18 @@ AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
77217721
/// \endcode
77227722
extern const AstTypeMatcher<DependentNameType> dependentNameType;
77237723

7724+
/// Matches a dependent template specialization type
7725+
///
7726+
/// Example matches A<T>::template B<T>
7727+
/// \code
7728+
/// template<typename T> struct A;
7729+
/// template<typename T> struct declToImport {
7730+
/// typename A<T>::template B<T> a;
7731+
/// };
7732+
/// \endcode
7733+
extern const AstTypeMatcher<DependentTemplateSpecializationType>
7734+
dependentTemplateSpecializationType;
7735+
77247736
/// Matches declarations whose declaration context, interpreted as a
77257737
/// Decl, matches \c InnerMatcher.
77267738
///

clang/lib/ASTMatchers/ASTMatchersInternal.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,8 @@ const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
11091109
const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
11101110
const AstTypeMatcher<DecayedType> decayedType;
11111111
const AstTypeMatcher<DependentNameType> dependentNameType;
1112+
const AstTypeMatcher<DependentTemplateSpecializationType>
1113+
dependentTemplateSpecializationType;
11121114
AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType,
11131115
AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
11141116
ComplexType));

clang/lib/ASTMatchers/Dynamic/Registry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ RegistryMaps::RegistryMaps() {
224224
REGISTER_MATCHER(declRefExpr);
225225
REGISTER_MATCHER(dependentNameType);
226226
REGISTER_MATCHER(dependentScopeDeclRefExpr);
227+
REGISTER_MATCHER(dependentTemplateSpecializationType);
227228
REGISTER_MATCHER(declStmt);
228229
REGISTER_MATCHER(declaratorDecl);
229230
REGISTER_MATCHER(decltypeType);

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -763,10 +763,6 @@ TEST_P(ImportType, ImportPackExpansion) {
763763
implicitCastExpr(has(declRefExpr()))))))));
764764
}
765765

766-
const internal::VariadicDynCastAllOfMatcher<Type,
767-
DependentTemplateSpecializationType>
768-
dependentTemplateSpecializationType;
769-
770766
TEST_P(ImportType, ImportDependentTemplateSpecialization) {
771767
MatchVerifier<Decl> Verifier;
772768
testImport("template<typename T>"

clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,21 @@ TEST_P(ASTMatchersTest, DependentNameType) {
19261926
dependentNameType()));
19271927
}
19281928

1929+
TEST_P(ASTMatchersTest, DependentTemplateSpecializationType) {
1930+
if (!GetParam().isCXX()) {
1931+
return;
1932+
}
1933+
1934+
EXPECT_TRUE(matches(
1935+
R"(
1936+
template<typename T> struct A;
1937+
template<typename T> struct declToImport {
1938+
typename A<T>::template B<T> a;
1939+
};
1940+
)",
1941+
dependentTemplateSpecializationType()));
1942+
}
1943+
19291944
TEST_P(ASTMatchersTest, RecordType) {
19301945
EXPECT_TRUE(matches("struct S {}; struct S s;",
19311946
recordType(hasDeclaration(recordDecl(hasName("S"))))));

0 commit comments

Comments
 (0)