hokein created this revision. hokein added a reviewer: sammccall. Herald added subscribers: usaxena95, kadircet, arphaman. Herald added a project: All. hokein requested review of this revision. Herald added projects: clang, clang-tools-extra.
If the underlying template name of a qualified template name is a using decl, TemplateName::getAsUsingDecl() will return it. This will make the UsingTemplateName consumer life easier. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D124437 Files: clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp clang/lib/AST/TemplateName.cpp clang/unittests/AST/TemplateNameTest.cpp Index: clang/unittests/AST/TemplateNameTest.cpp =================================================================== --- clang/unittests/AST/TemplateNameTest.cpp +++ clang/unittests/AST/TemplateNameTest.cpp @@ -82,6 +82,7 @@ const auto *USD = QTN->getUnderlyingTemplate().getAsUsingShadowDecl(); EXPECT_TRUE(USD); EXPECT_EQ(USD->getTargetDecl(), TN.getAsTemplateDecl()); + EXPECT_EQ(TN.getAsUsingShadowDecl(), USD); } TEST(TemplateName, UsingTemplate) { Index: clang/lib/AST/TemplateName.cpp =================================================================== --- clang/lib/AST/TemplateName.cpp +++ clang/lib/AST/TemplateName.cpp @@ -172,6 +172,8 @@ if (Decl *D = Storage.dyn_cast<Decl *>()) if (UsingShadowDecl *USD = dyn_cast<UsingShadowDecl>(D)) return USD; + if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) + return QTN->getUnderlyingTemplate().getAsUsingShadowDecl(); return nullptr; } Index: clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp +++ clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp @@ -90,6 +90,13 @@ template <template <typename> class T> class X {}; X<A> x; )cpp"}, + {R"cpp(namespace ns { template<typename T> class A {}; + namespace absl {using ns::^A;} + )cpp", + R"cpp( + template <template <typename> class T> class X {}; + X<absl::A> x; + )cpp"}, {R"cpp( namespace ns { template<typename T> struct ^A { ^A(T); }; } using ns::^A;
Index: clang/unittests/AST/TemplateNameTest.cpp =================================================================== --- clang/unittests/AST/TemplateNameTest.cpp +++ clang/unittests/AST/TemplateNameTest.cpp @@ -82,6 +82,7 @@ const auto *USD = QTN->getUnderlyingTemplate().getAsUsingShadowDecl(); EXPECT_TRUE(USD); EXPECT_EQ(USD->getTargetDecl(), TN.getAsTemplateDecl()); + EXPECT_EQ(TN.getAsUsingShadowDecl(), USD); } TEST(TemplateName, UsingTemplate) { Index: clang/lib/AST/TemplateName.cpp =================================================================== --- clang/lib/AST/TemplateName.cpp +++ clang/lib/AST/TemplateName.cpp @@ -172,6 +172,8 @@ if (Decl *D = Storage.dyn_cast<Decl *>()) if (UsingShadowDecl *USD = dyn_cast<UsingShadowDecl>(D)) return USD; + if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName()) + return QTN->getUnderlyingTemplate().getAsUsingShadowDecl(); return nullptr; } Index: clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp +++ clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp @@ -90,6 +90,13 @@ template <template <typename> class T> class X {}; X<A> x; )cpp"}, + {R"cpp(namespace ns { template<typename T> class A {}; + namespace absl {using ns::^A;} + )cpp", + R"cpp( + template <template <typename> class T> class X {}; + X<absl::A> x; + )cpp"}, {R"cpp( namespace ns { template<typename T> struct ^A { ^A(T); }; } using ns::^A;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits