Author: Gabor Marton Date: 2021-03-30T11:57:46+02:00 New Revision: 98f6cbd68eba04764f318d467abb10feca713776
URL: https://github.com/llvm/llvm-project/commit/98f6cbd68eba04764f318d467abb10feca713776 DIFF: https://github.com/llvm/llvm-project/commit/98f6cbd68eba04764f318d467abb10feca713776.diff LOG: [ASTImporter] Import member specialization/instantiation of enum decls We do the import of the member enum specialization similarly to as we do with member CXXRecordDecl specialization. Differential Revision: https://reviews.llvm.org/D99421 Added: Modified: clang/lib/AST/ASTImporter.cpp clang/unittests/AST/ASTImporterTest.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index ef7a3ea8a66c..dd11e3662148 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -2732,7 +2732,20 @@ ExpectedDecl ASTNodeImporter::VisitEnumDecl(EnumDecl *D) { 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()) diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index fdbf811c94dc..9f2b348905b5 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -6236,6 +6236,28 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportOfCapturedVLAType) { 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()); + EXPECT_EQ(FromD->getTemplateSpecializationKind(), + ToD->getTemplateSpecializationKind()); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, ); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits