Index: lib/AST/ASTImporter.cpp =================================================================== --- lib/AST/ASTImporter.cpp +++ lib/AST/ASTImporter.cpp @@ -419,6 +419,8 @@ Expected ImportFunctionTemplateWithTemplateArgsFromSpecialization( FunctionDecl *FromFD); + Error ImportTemplateParameterLists(const DeclaratorDecl *FromD, + DeclaratorDecl *ToD); Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD); @@ -2780,6 +2782,22 @@ return ToEnumerator; } +Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD, + DeclaratorDecl *ToD) { + unsigned int Num = FromD->getNumTemplateParameterLists(); + if (Num == 0) + return Error::success(); + SmallVector ToTPLists(Num); + for (unsigned int I = 0; I < Num; ++I) + if (Expected ToTPListOrErr = + import(FromD->getTemplateParameterList(I))) + ToTPLists[I] = *ToTPListOrErr; + else + return ToTPListOrErr.takeError(); + ToD->setTemplateParameterListsInfo(Importer.ToContext, ToTPLists); + return Error::success(); +} + Error ASTNodeImporter::ImportTemplateInformation( FunctionDecl *FromFD, FunctionDecl *ToFD) { switch (FromFD->getTemplatedKind()) { @@ -2826,6 +2844,9 @@ if (!POIOrErr) return POIOrErr.takeError(); + if (Error Err = ImportTemplateParameterLists(FromFD, ToFD)) + return Err; + TemplateSpecializationKind TSK = FTSInfo->getTemplateSpecializationKind(); ToFD->setFunctionTemplateSpecialization( std::get<0>(*FunctionAndArgsOrErr), ToTAList, /* InsertPos= */ nullptr, Index: unittests/AST/ASTImporterTest.cpp =================================================================== --- unittests/AST/ASTImporterTest.cpp +++ unittests/AST/ASTImporterTest.cpp @@ -5083,6 +5083,24 @@ EXPECT_FALSE(ImportedD->getUnderlyingType()->isIncompleteType()); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportTemplateParameterLists) { + auto Code = + R"( + template + int f() { return 0; } + template <> int f() { return 4; } + )"; + + Decl *FromTU = getTuDecl(Code, Lang_CXX); + auto *FromD = FirstDeclMatcher().match(FromTU, + functionDecl(hasName("f"), isExplicitTemplateSpecialization())); + ASSERT_EQ(FromD->getNumTemplateParameterLists(), 1); + + auto *ToD = Import(FromD, Lang_CXX); + // The template parameter list should exist. + EXPECT_EQ(ToD->getNumTemplateParameterLists(), 1); +} + struct ASTImporterLookupTableTest : ASTImporterOptionSpecificTestBase {}; TEST_P(ASTImporterLookupTableTest, OneDecl) {