diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -2732,7 +2732,20 @@ D2->setBraceRange(ToBraceRange); D2->setAccess(D->getAccess()); D2->setLexicalDeclContext(LexicalDC); - LexicalDC->addDeclInternal(D2); + addDeclToContexts(D, D2); + + if (MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo()) { + TemplateSpecializationKind SK = MemberInfo->getTemplateSpecializationKind(); + EnumDecl *FromInst = D->getInstantiatedFromMemberEnum(); + if (Expected ToInstOrErr = import(FromInst)) + D2->setInstantiationOfMemberEnum(*ToInstOrErr, SK); + else + return ToInstOrErr.takeError(); + if (ExpectedSLoc POIOrErr = import(MemberInfo->getPointOfInstantiation())) + D2->getMemberSpecializationInfo()->setPointOfInstantiation(*POIOrErr); + else + return POIOrErr.takeError(); + } // Import the definition if (D->isCompleteDefinition()) diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -6236,6 +6236,28 @@ EXPECT_NE(FromFD->getCapturedVLAType(), ToFD->getCapturedVLAType()); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportEnumMemberSpecialization) { + Decl *FromTU = getTuDecl( + R"( + template struct A { + enum tagname { enumerator }; + }; + template struct A; + )", + Lang_CXX03); + auto *FromD = FirstDeclMatcher().match( + FromTU, enumDecl(hasName("tagname"), + hasParent(classTemplateSpecializationDecl()))); + ASSERT_TRUE(FromD); + ASSERT_TRUE(FromD->getMemberSpecializationInfo()); + + auto *ToD = Import(FromD, Lang_CXX03); + EXPECT_TRUE(ToD); + EXPECT_TRUE(ToD->getMemberSpecializationInfo()); + EXPECT_EQ(FromD->getTemplateSpecializationKind(), + ToD->getTemplateSpecializationKind()); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, );