diff options
author | Balazs Keri <1.int32@gmail.com> | 2018-07-17 09:52:41 +0000 |
---|---|---|
committer | Balazs Keri <1.int32@gmail.com> | 2018-07-17 09:52:41 +0000 |
commit | ac6802207b521497a5304c037ad1fb355ad09cb0 (patch) | |
tree | 048b56b60e278f608068892e0fd2e187fd1703de /clang/lib/AST | |
parent | 3d1a0df2e8e526a0e3842cbf98a07ff17f5349fb (diff) |
[ASTImporter] Import described template (if any) of function.
Summary:
When a function is imported, check if it has a described template.
The name lookup is corrected to find the templated entity in this case.
The described template of the function is imported too.
Reviewers: a.sidorin, a_sidorin
Reviewed By: a_sidorin
Subscribers: a_sidorin, martong, cfe-commits
Differential Revision: https://reviews.llvm.org/D49235
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 366c2064d4e..980ab478d59 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -2539,6 +2539,7 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { return ToD; const FunctionDecl *FoundByLookup = nullptr; + FunctionTemplateDecl *FromFT = D->getDescribedFunctionTemplate(); // If this is a function template specialization, then try to find the same // existing specialization in the "to" context. The localUncachedLookup @@ -2565,6 +2566,14 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { if (!FoundDecl->isInIdentifierNamespace(IDNS)) continue; + // If template was found, look at the templated function. + if (FromFT) { + if (auto *Template = dyn_cast<FunctionTemplateDecl>(FoundDecl)) + FoundDecl = Template->getTemplatedDecl(); + else + continue; + } + if (auto *FoundFunction = dyn_cast<FunctionDecl>(FoundDecl)) { if (FoundFunction->hasExternalFormalLinkage() && D->hasExternalFormalLinkage()) { @@ -2740,6 +2749,11 @@ Decl *ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { ToFunction->setType(T); } + // Import the describing template function, if any. + if (FromFT) + if (!Importer.Import(FromFT)) + return nullptr; + if (D->doesThisDeclarationHaveABody()) { if (Stmt *FromBody = D->getBody()) { if (Stmt *ToBody = Importer.Import(FromBody)) { |