martong updated this revision to Diff 333858. martong marked an inline comment as done. martong added a comment.
- Fix typo Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D99421/new/ https://reviews.llvm.org/D99421 Files: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -6236,6 +6236,26 @@ EXPECT_NE(FromFD->getCapturedVLAType(), ToFD->getCapturedVLAType()); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportEnumMemberSpecialization) { + Decl *FromTU = getTuDecl( + R"( + template <class T> struct A { + enum tagname { enumerator }; + }; + template struct A<int>; + )", + Lang_CXX03); + auto *FromD = FirstDeclMatcher<EnumDecl>().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()); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, ); Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ 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<EnumDecl *> 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())
Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -6236,6 +6236,26 @@ EXPECT_NE(FromFD->getCapturedVLAType(), ToFD->getCapturedVLAType()); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportEnumMemberSpecialization) { + Decl *FromTU = getTuDecl( + R"( + template <class T> struct A { + enum tagname { enumerator }; + }; + template struct A<int>; + )", + Lang_CXX03); + auto *FromD = FirstDeclMatcher<EnumDecl>().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()); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, ); Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ 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<EnumDecl *> 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())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits