forked from OSchip/llvm-project
[ASTImporter] Import TemplateParameterLists in function templates.
Summary: Correct missing import of TemplateParameterList in function decl. Reviewers: martong, a.sidorin, shafik Reviewed By: martong Subscribers: rnkovacs, dkrupp, Szelethus, gamesh411, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D60461 llvm-svn: 360132
This commit is contained in:
parent
3c975a0ab5
commit
1efc97425d
|
@ -419,6 +419,8 @@ namespace clang {
|
|||
Expected<FunctionTemplateAndArgsTy>
|
||||
ImportFunctionTemplateWithTemplateArgsFromSpecialization(
|
||||
FunctionDecl *FromFD);
|
||||
Error ImportTemplateParameterLists(const DeclaratorDecl *FromD,
|
||||
DeclaratorDecl *ToD);
|
||||
|
||||
Error ImportTemplateInformation(FunctionDecl *FromFD, FunctionDecl *ToFD);
|
||||
|
||||
|
@ -2780,6 +2782,22 @@ ExpectedDecl ASTNodeImporter::VisitEnumConstantDecl(EnumConstantDecl *D) {
|
|||
return ToEnumerator;
|
||||
}
|
||||
|
||||
Error ASTNodeImporter::ImportTemplateParameterLists(const DeclaratorDecl *FromD,
|
||||
DeclaratorDecl *ToD) {
|
||||
unsigned int Num = FromD->getNumTemplateParameterLists();
|
||||
if (Num == 0)
|
||||
return Error::success();
|
||||
SmallVector<TemplateParameterList *, 2> ToTPLists(Num);
|
||||
for (unsigned int I = 0; I < Num; ++I)
|
||||
if (Expected<TemplateParameterList *> 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 @@ Error ASTNodeImporter::ImportTemplateInformation(
|
|||
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,
|
||||
|
|
|
@ -5083,6 +5083,24 @@ TEST_P(ASTImporterOptionSpecificTestBase,
|
|||
EXPECT_FALSE(ImportedD->getUnderlyingType()->isIncompleteType());
|
||||
}
|
||||
|
||||
TEST_P(ASTImporterOptionSpecificTestBase, ImportTemplateParameterLists) {
|
||||
auto Code =
|
||||
R"(
|
||||
template<class T>
|
||||
int f() { return 0; }
|
||||
template <> int f<int>() { return 4; }
|
||||
)";
|
||||
|
||||
Decl *FromTU = getTuDecl(Code, Lang_CXX);
|
||||
auto *FromD = FirstDeclMatcher<FunctionDecl>().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) {
|
||||
|
|
Loading…
Reference in New Issue