diff options
author | Vince Harron <vince@nethacker.com> | 2015-03-22 08:47:07 +0000 |
---|---|---|
committer | Vince Harron <vince@nethacker.com> | 2015-03-22 08:47:07 +0000 |
commit | 08dcf60295b79ac6a79ac94933778001eab2d389 (patch) | |
tree | 4541915833011ea477654515b30e3f4928a0f9db /clang/lib/Serialization/ASTReaderDecl.cpp | |
parent | c371ff048df8731052976f4e628ed1861cf61cfd (diff) | |
download | bcm5719-llvm-08dcf60295b79ac6a79ac94933778001eab2d389.tar.gz bcm5719-llvm-08dcf60295b79ac6a79ac94933778001eab2d389.zip |
Reverting 232853 and 232870 because they depend on 232793,
which was reverted because it was causing LLDB test failures
llvm-svn: 232907
Diffstat (limited to 'clang/lib/Serialization/ASTReaderDecl.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 5c6820f4834..83882a83693 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -228,11 +228,9 @@ namespace clang { template <typename DeclT> static void attachPreviousDeclImpl(ASTReader &Reader, - Redeclarable<DeclT> *D, Decl *Previous, - Decl *Canon); + Redeclarable<DeclT> *D, Decl *Previous); static void attachPreviousDeclImpl(ASTReader &Reader, ...); - static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, - Decl *Canon); + static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous); template <typename DeclT> static void attachLatestDeclImpl(Redeclarable<DeclT> *D, Decl *Latest); @@ -2623,11 +2621,8 @@ ASTDeclReader::FindExistingResult::~FindExistingResult() { if (needsAnonymousDeclarationNumber(New)) { setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(), AnonymousDeclNumber, New); - } else if (DC->isTranslationUnit() && Reader.SemaObj && - !Reader.getContext().getLangOpts().CPlusPlus) { - if (Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, Name)) - Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()] - .push_back(New); + } else if (DC->isTranslationUnit() && Reader.SemaObj) { + Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, Name); } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) { // Add the declaration to its redeclaration context so later merging // lookups will find it. @@ -2732,8 +2727,7 @@ ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) { if (isSameEntity(Existing, D)) return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber, TypedefNameForLinkage); - } else if (DC->isTranslationUnit() && Reader.SemaObj && - !Reader.getContext().getLangOpts().CPlusPlus) { + } else if (DC->isTranslationUnit() && Reader.SemaObj) { IdentifierResolver &IdResolver = Reader.SemaObj->IdResolver; // Temporarily consider the identifier to be up-to-date. We don't want to @@ -2822,14 +2816,14 @@ Decl *ASTReader::getMostRecentExistingDecl(Decl *D) { template<typename DeclT> void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<DeclT> *D, - Decl *Previous, Decl *Canon) { + Decl *Previous) { D->RedeclLink.setPrevious(cast<DeclT>(Previous)); } namespace clang { template<> void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<FunctionDecl> *D, - Decl *Previous, Decl *Canon) { + Decl *Previous) { FunctionDecl *FD = static_cast<FunctionDecl*>(D); FunctionDecl *PrevFD = cast<FunctionDecl>(Previous); @@ -2856,17 +2850,25 @@ void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, FD->IsInline = true; } - // If we need to propagate an exception specification along the redecl - // chain, make a note of that so that we can do so later. + // If this declaration has an unresolved exception specification but the + // previous declaration had a resolved one, resolve the exception + // specification now. If this declaration has a resolved exception + // specification but the previous declarations did not, apply our exception + // specification to all prior ones now. auto *FPT = FD->getType()->getAs<FunctionProtoType>(); auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>(); if (FPT && PrevFPT) { - bool IsUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType()); - bool WasUnresolved = - isUnresolvedExceptionSpec(PrevFPT->getExceptionSpecType()); - if (IsUnresolved != WasUnresolved) - Reader.PendingExceptionSpecUpdates.insert( - std::make_pair(Canon, IsUnresolved ? PrevFD : FD)); + bool WasUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType()); + bool IsUnresolved = isUnresolvedExceptionSpec(PrevFPT->getExceptionSpecType()); + if (WasUnresolved && !IsUnresolved) { + Reader.Context.adjustExceptionSpec( + FD, PrevFPT->getExtProtoInfo().ExceptionSpec); + } else if (!WasUnresolved && IsUnresolved) { + FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); + for (FunctionDecl *PrevFDToUpdate = PrevFD; PrevFDToUpdate; + PrevFDToUpdate = PrevFDToUpdate->getPreviousDecl()) + Reader.Context.adjustExceptionSpec(PrevFDToUpdate, EPI.ExceptionSpec); + } } } } @@ -2875,14 +2877,14 @@ void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, ...) { } void ASTDeclReader::attachPreviousDecl(ASTReader &Reader, Decl *D, - Decl *Previous, Decl *Canon) { + Decl *Previous) { assert(D && Previous); switch (D->getKind()) { #define ABSTRACT_DECL(TYPE) -#define DECL(TYPE, BASE) \ - case Decl::TYPE: \ - attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \ +#define DECL(TYPE, BASE) \ + case Decl::TYPE: \ + attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous); \ break; #include "clang/AST/DeclNodes.inc" } @@ -3386,7 +3388,7 @@ void ASTReader::loadPendingDeclChain(Decl *CanonDecl) { if (Chain[I] == CanonDecl) continue; - ASTDeclReader::attachPreviousDecl(*this, Chain[I], MostRecent, CanonDecl); + ASTDeclReader::attachPreviousDecl(*this, Chain[I], MostRecent); MostRecent = Chain[I]; } ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent); @@ -3730,24 +3732,23 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile, } case UPD_CXX_RESOLVED_EXCEPTION_SPEC: { + // FIXME: This doesn't send the right notifications if there are + // ASTMutationListeners other than an ASTWriter. FunctionProtoType::ExceptionSpecInfo ESI; SmallVector<QualType, 8> ExceptionStorage; Reader.readExceptionSpec(ModuleFile, ExceptionStorage, ESI, Record, Idx); - - // Update this declaration's exception specification, if needed. - auto *FD = cast<FunctionDecl>(D); - auto *FPT = FD->getType()->castAs<FunctionProtoType>(); - // FIXME: If the exception specification is already present, check that it - // matches. - if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) { + for (auto *Redecl : merged_redecls(D)) { + auto *FD = cast<FunctionDecl>(Redecl); + auto *FPT = FD->getType()->castAs<FunctionProtoType>(); + if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) { + // AST invariant: if any exception spec in the redecl chain is + // resolved, all are resolved. We don't need to go any further. + // FIXME: If the exception spec is resolved, check that it matches. + break; + } FD->setType(Reader.Context.getFunctionType( FPT->getReturnType(), FPT->getParamTypes(), FPT->getExtProtoInfo().withExceptionSpec(ESI))); - - // When we get to the end of deserializing, see if there are other decls - // that we need to propagate this exception specification onto. - Reader.PendingExceptionSpecUpdates.insert( - std::make_pair(FD->getCanonicalDecl(), FD)); } break; } |