summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorTyker <tyker1@outlook.com>2019-11-30 16:42:33 +0100
committerTyker <tyker1@outlook.com>2019-11-30 16:42:33 +0100
commit3c7f6b439699a9cbbc0ac8d288cc70aff357446b (patch)
treeb227c1c89316a2ba58057bf23db90e0ff37ad6db /clang/lib/Serialization
parentc2443155a0fb245c8f17f2c1c72b6ea391e86e81 (diff)
downloadbcm5719-llvm-3c7f6b439699a9cbbc0ac8d288cc70aff357446b.tar.gz
bcm5719-llvm-3c7f6b439699a9cbbc0ac8d288cc70aff357446b.zip
[clang][modules] Add support for merging lifetime-extended temporaries
Summary: Add support for merging lifetime-extended temporaries Reviewers: rsmith Reviewed By: rsmith Subscribers: xbolva00, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D70190
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 8991a39a706..d6c57757cf8 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -424,6 +424,9 @@ namespace clang {
template<typename T>
void mergeMergeable(Mergeable<T> *D);
+ template <>
+ void mergeMergeable(Mergeable<LifetimeExtendedTemporaryDecl> *D);
+
void mergeTemplatePattern(RedeclarableTemplateDecl *D,
RedeclarableTemplateDecl *Existing,
DeclID DsID, bool IsKeyDecl);
@@ -2358,6 +2361,7 @@ void ASTDeclReader::VisitLifetimeExtendedTemporaryDecl(
if (Record.readInt())
D->Value = new (D->getASTContext()) APValue(Record.readAPValue());
D->ManglingNumber = Record.readInt();
+ mergeMergeable(D);
}
std::pair<uint64_t, uint64_t>
@@ -2555,6 +2559,28 @@ static bool allowODRLikeMergeInC(NamedDecl *ND) {
return false;
}
+/// Attempts to merge LifetimeExtendedTemporaryDecl with
+/// identical class definitions from two different modules.
+template<>
+void ASTDeclReader::mergeMergeable(
+ Mergeable<LifetimeExtendedTemporaryDecl> *D) {
+ // If modules are not available, there is no reason to perform this merge.
+ if (!Reader.getContext().getLangOpts().Modules)
+ return;
+
+ LifetimeExtendedTemporaryDecl *LETDecl =
+ static_cast<LifetimeExtendedTemporaryDecl *>(D);
+
+ LifetimeExtendedTemporaryDecl *&LookupResult =
+ Reader.LETemporaryForMerging[std::make_pair(
+ LETDecl->getExtendingDecl(), LETDecl->getManglingNumber())];
+ if (LookupResult)
+ Reader.getContext().setPrimaryMergedDecl(LETDecl,
+ LookupResult->getCanonicalDecl());
+ else
+ LookupResult = LETDecl;
+}
+
/// Attempts to merge the given declaration (D) with another declaration
/// of the same entity, for the case where the entity is not actually
/// redeclarable. This happens, for instance, when merging the fields of
OpenPOWER on IntegriCloud