diff options
| author | Tyker <tyker1@outlook.com> | 2019-11-30 16:42:33 +0100 |
|---|---|---|
| committer | Tyker <tyker1@outlook.com> | 2019-11-30 16:42:33 +0100 |
| commit | 3c7f6b439699a9cbbc0ac8d288cc70aff357446b (patch) | |
| tree | b227c1c89316a2ba58057bf23db90e0ff37ad6db /clang/lib/Serialization | |
| parent | c2443155a0fb245c8f17f2c1c72b6ea391e86e81 (diff) | |
| download | bcm5719-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.cpp | 26 |
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 |

