riccibruno created this revision. riccibruno added reviewers: aaron.ballman, klimek, njames93. riccibruno added a project: clang. Herald added a subscriber: cfe-commits. riccibruno requested review of this revision.
There are already matchers for type template parameters and non-type template parameters, but somehow no matcher exists for template template parameters and I need it to write unit tests. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85536 Files: clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/ASTMatchersInternal.cpp clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp Index: clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -408,6 +408,15 @@ EXPECT_TRUE(notMatches("template <int N> void f();", templateTypeParmDecl())); } +TEST_P(ASTMatchersTest, TemplateTemplateParmDecl) { + if (!GetParam().isCXX()) + return; + EXPECT_TRUE(matches("template <template <typename> class Z> void f();", + templateTemplateParmDecl(hasName("Z")))); + EXPECT_TRUE(notMatches("template <typename, int> void f();", + templateTemplateParmDecl())); +} + TEST_P(ASTMatchersTest, UserDefinedLiteral) { if (!GetParam().isCXX11OrLater()) { return; Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -514,6 +514,7 @@ REGISTER_MATCHER(templateArgumentCountIs); REGISTER_MATCHER(templateName); REGISTER_MATCHER(templateSpecializationType); + REGISTER_MATCHER(templateTemplateParmDecl); REGISTER_MATCHER(templateTypeParmDecl); REGISTER_MATCHER(templateTypeParmType); REGISTER_MATCHER(throughUsingDecl); Index: clang/lib/ASTMatchers/ASTMatchersInternal.cpp =================================================================== --- clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -739,6 +739,9 @@ nonTypeTemplateParmDecl; const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl> templateTypeParmDecl; +const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTemplateParmDecl> + templateTemplateParmDecl; + const internal::VariadicAllOfMatcher<QualType> qualType; const internal::VariadicAllOfMatcher<Type> type; const internal::VariadicAllOfMatcher<TypeLoc> typeLoc; Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -549,6 +549,18 @@ extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl> templateTypeParmDecl; +/// Matches template template parameter declarations. +/// +/// Given +/// \code +/// template <template <typename> class Z, int N> struct C {}; +/// \endcode +/// templateTypeParmDecl() +/// matches 'Z', but not 'N'. +extern const internal::VariadicDynCastAllOfMatcher<Decl, + TemplateTemplateParmDecl> + templateTemplateParmDecl; + /// Matches public C++ declarations and C++ base specifers that specify public /// inheritance. ///
Index: clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -408,6 +408,15 @@ EXPECT_TRUE(notMatches("template <int N> void f();", templateTypeParmDecl())); } +TEST_P(ASTMatchersTest, TemplateTemplateParmDecl) { + if (!GetParam().isCXX()) + return; + EXPECT_TRUE(matches("template <template <typename> class Z> void f();", + templateTemplateParmDecl(hasName("Z")))); + EXPECT_TRUE(notMatches("template <typename, int> void f();", + templateTemplateParmDecl())); +} + TEST_P(ASTMatchersTest, UserDefinedLiteral) { if (!GetParam().isCXX11OrLater()) { return; Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -514,6 +514,7 @@ REGISTER_MATCHER(templateArgumentCountIs); REGISTER_MATCHER(templateName); REGISTER_MATCHER(templateSpecializationType); + REGISTER_MATCHER(templateTemplateParmDecl); REGISTER_MATCHER(templateTypeParmDecl); REGISTER_MATCHER(templateTypeParmType); REGISTER_MATCHER(throughUsingDecl); Index: clang/lib/ASTMatchers/ASTMatchersInternal.cpp =================================================================== --- clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -739,6 +739,9 @@ nonTypeTemplateParmDecl; const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl> templateTypeParmDecl; +const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTemplateParmDecl> + templateTemplateParmDecl; + const internal::VariadicAllOfMatcher<QualType> qualType; const internal::VariadicAllOfMatcher<Type> type; const internal::VariadicAllOfMatcher<TypeLoc> typeLoc; Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -549,6 +549,18 @@ extern const internal::VariadicDynCastAllOfMatcher<Decl, TemplateTypeParmDecl> templateTypeParmDecl; +/// Matches template template parameter declarations. +/// +/// Given +/// \code +/// template <template <typename> class Z, int N> struct C {}; +/// \endcode +/// templateTypeParmDecl() +/// matches 'Z', but not 'N'. +extern const internal::VariadicDynCastAllOfMatcher<Decl, + TemplateTemplateParmDecl> + templateTemplateParmDecl; + /// Matches public C++ declarations and C++ base specifers that specify public /// inheritance. ///
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits