From: Douglas Gregor Date: Wed, 3 Oct 2012 18:34:48 +0000 (+0000) Subject: Revert most of the functionality in r165001. Instead, make sure that X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=559458c830ee13b55318835247faabc4b08941fb;p=platform%2Fupstream%2Fllvm.git Revert most of the functionality in r165001. Instead, make sure that the ASTReader doesn't attach a body to a function that is already defined elsewhere. llvm-svn: 165137 --- diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 7c52597..af69148 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -687,12 +687,6 @@ private: /// Objective-C protocols. std::deque InterestingDecls; - /// \brief Redecls that have been added to the AST - /// - /// Redecls that are deserialized but not in RedeclsAddedToAST must - /// not be passed to the ASTConsumers, even if they are InterestignDecls. - llvm::SmallPtrSet RedeclsAddedToAST; - /// \brief The set of redeclarable declarations that have been deserialized /// since the last time the declaration chains were linked. llvm::SmallPtrSet RedeclsDeserialized; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index cc6d073..f5de6c4 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -5614,10 +5614,7 @@ void ASTReader::ReadPendingInstantiations( SourceLocation Loc = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); - // For modules, find out whether an instantiation already exists - if (!getContext().getLangOpts().Modules - || needPendingInstantiation(D)) - Pending.push_back(std::make_pair(D, Loc)); + Pending.push_back(std::make_pair(D, Loc)); } PendingInstantiations.clear(); } @@ -6528,5 +6525,4 @@ ASTReader::~ASTReader() { J != F; ++J) delete J->first; } - assert(RedeclsAddedToAST.empty() && "RedeclsAddedToAST not empty!"); } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 42ea794..c291b4b 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -320,7 +320,10 @@ void ASTDeclReader::Visit(Decl *D) { ID->TypeForDecl = Reader.GetType(TypeIDForTypeDecl).getTypePtrOrNull(); } else if (FunctionDecl *FD = dyn_cast(D)) { // FunctionDecl's body was written last after all other Stmts/Exprs. - if (Record[Idx++]) + // We only read it if FD doesn't already have a body (e.g., from another + // module). + if (Record[Idx++] && + (!Reader.getContext().getLangOpts().Modules || !FD->hasBody())) FD->setLazyBody(GetCurrentCursorOffset()); } else if (D->isTemplateParameter()) { // If we have a fully initialized template parameter, we can now @@ -1778,11 +1781,9 @@ ASTDeclReader::FindExistingResult::~FindExistingResult() { DeclContext *DC = New->getLexicalDeclContext(); if (DC->isTranslationUnit() && Reader.SemaObj) { - if (Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, New->getDeclName())) - Reader.RedeclsAddedToAST.insert(New); + Reader.SemaObj->IdResolver.tryAddTopLevelDecl(New, New->getDeclName()); } else if (DC->isNamespace()) { DC->addDecl(New); - Reader.RedeclsAddedToAST.insert(New); } } @@ -2157,13 +2158,7 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { // AST consumer might need to know about, queue it. // We don't pass it to the consumer immediately because we may be in recursive // loading, and some declarations may still be initializing. - if (getContext().getLangOpts().Modules) { - if (RedeclsAddedToAST.count(D)) { - RedeclsAddedToAST.erase(D); - if (isConsumerInterestedIn(D)) - InterestingDecls.push_back(D); - } - } else if (isConsumerInterestedIn(D)) + if (isConsumerInterestedIn(D)) InterestingDecls.push_back(D); return D;