https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/76493
>From 9a9a203bbea079a033a14e610a3c00dff5ec408a Mon Sep 17 00:00:00 2001 From: huqizhi <huqi...@feysh.com> Date: Thu, 28 Dec 2023 15:51:32 +0800 Subject: [PATCH] [clang][ASTImporter] import InstantiatedFromMember of ClassTemplateSpecializationDecl --- clang/lib/AST/ASTImporter.cpp | 5 ++++ clang/unittests/AST/ASTImporterTest.cpp | 32 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index b61180c4f3491d..9ffae72346f2af 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -6141,6 +6141,11 @@ ExpectedDecl ASTNodeImporter::VisitClassTemplateSpecializationDecl( InsertPos)) // Add this partial specialization to the class template. ClassTemplate->AddPartialSpecialization(PartSpec2, InsertPos); + if (Expected<ClassTemplatePartialSpecializationDecl *> ToInstOrErr = + import(PartialSpec->getInstantiatedFromMember())) + PartSpec2->setInstantiatedFromMember(*ToInstOrErr); + else + return ToInstOrErr.takeError(); updateLookupTableForTemplateParameters(*ToTPList); } else { // Not a partial specialization. diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index ed8ecb080e268d..3c228d0e5ecd5f 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -9342,6 +9342,38 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportConflictTypeAliasTemplate) { EXPECT_FALSE(ImportedCallable); } +AST_MATCHER(ClassTemplateSpecializationDecl, hasInstantiatedFromMember) { + if (auto Instantiate = Node.getInstantiatedFrom()) { + if (auto *FromPartialSpecialization = + Instantiate.get<ClassTemplatePartialSpecializationDecl *>()) { + return nullptr != FromPartialSpecialization->getInstantiatedFromMember(); + } + } + return false; +} + +TEST_P(ASTImporterOptionSpecificTestBase, ImportInstantiatedFromMember) { + const char *Code = + R"( + template <typename> struct B { + template <typename, bool = false> union D; + template <typename T> union D<T> {}; + D<int> d; + }; + B<int> b; + )"; + Decl *FromTU = getTuDecl(Code, Lang_CXX17); + auto *FromA = FirstDeclMatcher<ClassTemplateSpecializationDecl>().match( + FromTU, classTemplateSpecializationDecl(hasName("D"), + hasInstantiatedFromMember())); + auto *FromPartialSpecialization = + cast<ClassTemplatePartialSpecializationDecl *>( + FromA->getInstantiatedFrom()); + auto *ImportedPartialSpecialization = + Import(FromPartialSpecialization, Lang_CXX11); + EXPECT_TRUE(ImportedPartialSpecialization->getInstantiatedFromMember()); +} + INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits