r267744 - Revert r267691, it caused PR27535.
Vassil Vassilev via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 28 05:16:31 PDT 2016
Hi Nico,
I have a fix. What is the right way of putting it in? Shall I revert
the "revert" and commit the fix afterwards?
Many thanks
Vassil
On 27/04/16 19:26, Nico Weber via cfe-commits wrote:
> Author: nico
> Date: Wed Apr 27 12:26:08 2016
> New Revision: 267744
>
> URL: http://llvm.org/viewvc/llvm-project?rev=267744&view=rev
> Log:
> Revert r267691, it caused PR27535.
>
> Removed:
> cfe/trunk/test/Modules/Inputs/PR27401/
> cfe/trunk/test/Modules/pr27401.cpp
> Modified:
> cfe/trunk/include/clang/AST/DeclBase.h
> cfe/trunk/include/clang/Serialization/ASTWriter.h
> cfe/trunk/lib/AST/DeclBase.cpp
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> cfe/trunk/lib/Serialization/ASTWriter.cpp
> cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
>
> Modified: cfe/trunk/include/clang/AST/DeclBase.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclBase.h (original)
> +++ cfe/trunk/include/clang/AST/DeclBase.h Wed Apr 27 12:26:08 2016
> @@ -518,8 +518,8 @@ public:
> bool isImplicit() const { return Implicit; }
> void setImplicit(bool I = true) { Implicit = I; }
>
> - /// \brief Whether *any* (re-)declaration of the entity was used, meaning that
> - /// a definition is required.
> + /// \brief Whether this declaration was used, meaning that a definition
> + /// is required.
> ///
> /// \param CheckUsedAttr When true, also consider the "used" attribute
> /// (in addition to the "used" bit set by \c setUsed()) when determining
> @@ -529,8 +529,7 @@ public:
> /// \brief Set whether the declaration is used, in the sense of odr-use.
> ///
> /// This should only be used immediately after creating a declaration.
> - /// It intentionally doesn't notify any listeners.
> - void setIsUsed() { getCanonicalDecl()->Used = true; }
> + void setIsUsed() { Used = true; }
>
> /// \brief Mark the declaration used, in the sense of odr-use.
> ///
>
> Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTWriter.h Wed Apr 27 12:26:08 2016
> @@ -565,17 +565,6 @@ public:
> /// decl.
> const Decl *getFirstLocalDecl(const Decl *D);
>
> - /// \brief Is this a local declaration (that is, one that will be written to
> - /// our AST file)? This is the case for declarations that are neither imported
> - /// from another AST file nor predefined.
> - bool IsLocalDecl(const Decl *D) {
> - if (D->isFromASTFile())
> - return false;
> - auto I = DeclIDs.find(D);
> - return (I == DeclIDs.end() ||
> - I->second >= serialization::NUM_PREDEF_DECL_IDS);
> - };
> -
> /// \brief Emit a reference to a declaration.
> void AddDeclRef(const Decl *D, RecordDataImpl &Record);
>
>
> Modified: cfe/trunk/lib/AST/DeclBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
> +++ cfe/trunk/lib/AST/DeclBase.cpp Wed Apr 27 12:26:08 2016
> @@ -340,29 +340,25 @@ unsigned Decl::getMaxAlignment() const {
> return Align;
> }
>
> -bool Decl::isUsed(bool CheckUsedAttr) const {
> - const Decl *CanonD = getCanonicalDecl();
> - if (CanonD->Used)
> +bool Decl::isUsed(bool CheckUsedAttr) const {
> + if (Used)
> return true;
> -
> +
> // Check for used attribute.
> - // Ask the most recent decl, since attributes accumulate in the redecl chain.
> - if (CheckUsedAttr && getMostRecentDecl()->hasAttr<UsedAttr>())
> + if (CheckUsedAttr && hasAttr<UsedAttr>())
> return true;
>
> - // The information may have not been deserialized yet. Force deserialization
> - // to complete the needed information.
> - return getMostRecentDecl()->getCanonicalDecl()->Used;
> + return false;
> }
>
> void Decl::markUsed(ASTContext &C) {
> - if (isUsed())
> + if (Used)
> return;
>
> if (C.getASTMutationListener())
> C.getASTMutationListener()->DeclarationMarkedUsed(this);
>
> - setIsUsed();
> + Used = true;
> }
>
> bool Decl::isReferenced() const {
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Apr 27 12:26:08 2016
> @@ -13011,7 +13011,17 @@ void Sema::MarkFunctionReferenced(Source
> UndefinedButUsed.insert(std::make_pair(Func->getCanonicalDecl(), Loc));
> }
>
> - Func->markUsed(Context);
> + // Normally the most current decl is marked used while processing the use and
> + // any subsequent decls are marked used by decl merging. This fails with
> + // template instantiation since marking can happen at the end of the file
> + // and, because of the two phase lookup, this function is called with at
> + // decl in the middle of a decl chain. We loop to maintain the invariant
> + // that once a decl is used, all decls after it are also used.
> + for (FunctionDecl *F = Func->getMostRecentDecl();; F = F->getPreviousDecl()) {
> + F->markUsed(Context);
> + if (F == Func)
> + break;
> + }
> }
>
> static void
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Wed Apr 27 12:26:08 2016
> @@ -51,11 +51,6 @@ namespace clang {
>
> bool HasPendingBody;
>
> - ///\brief A flag to carry the information for a decl from the entity is
> - /// used. We use it to delay the marking of the canonical decl as used until
> - /// the entire declaration is deserialized and merged.
> - bool IsDeclMarkedUsed;
> -
> uint64_t GetCurrentCursorOffset();
>
> uint64_t ReadLocalOffset(const RecordData &R, unsigned &I) {
> @@ -222,8 +217,7 @@ namespace clang {
> : Reader(Reader), F(*Loc.F), Offset(Loc.Offset), ThisDeclID(thisDeclID),
> ThisDeclLoc(ThisDeclLoc), Record(Record), Idx(Idx),
> TypeIDForTypeDecl(0), NamedDeclForTagDecl(0),
> - TypedefNameForLinkage(nullptr), HasPendingBody(false),
> - IsDeclMarkedUsed(false) {}
> + TypedefNameForLinkage(nullptr), HasPendingBody(false) {}
>
> template <typename DeclT>
> static Decl *getMostRecentDeclImpl(Redeclarable<DeclT> *D);
> @@ -450,11 +444,6 @@ uint64_t ASTDeclReader::GetCurrentCursor
> void ASTDeclReader::Visit(Decl *D) {
> DeclVisitor<ASTDeclReader, void>::Visit(D);
>
> - // At this point we have deserialized and merged the decl and it is safe to
> - // update its canonical decl to signal that the entire entity is used.
> - D->getCanonicalDecl()->Used |= IsDeclMarkedUsed;
> - IsDeclMarkedUsed = false;
> -
> if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
> if (DD->DeclInfo) {
> DeclaratorDecl::ExtInfo *Info =
> @@ -535,7 +524,6 @@ void ASTDeclReader::VisitDecl(Decl *D) {
> }
> D->setImplicit(Record[Idx++]);
> D->Used = Record[Idx++];
> - IsDeclMarkedUsed |= D->Used;
> D->setReferenced(Record[Idx++]);
> D->setTopLevelDeclInObjCContainer(Record[Idx++]);
> D->setAccess((AccessSpecifier)Record[Idx++]);
> @@ -560,7 +548,7 @@ void ASTDeclReader::VisitDecl(Decl *D) {
> if (Owner->NameVisibility != Module::AllVisible) {
> // The owning module is not visible. Mark this declaration as hidden.
> D->Hidden = true;
> -
> +
> // Note that this declaration was hidden because its owning module is
> // not yet visible.
> Reader.HiddenNamesMap[Owner].push_back(D);
> @@ -2367,8 +2355,6 @@ void ASTDeclReader::mergeRedeclarable(Re
> // appropriate canonical declaration.
> D->RedeclLink = Redeclarable<T>::PreviousDeclLink(ExistingCanon);
> D->First = ExistingCanon;
> - ExistingCanon->Used |= D->Used;
> - D->Used = false;
>
> // When we merge a namespace, update its pointer to the first namespace.
> // We cannot have loaded any redeclarations of this declaration yet, so
> @@ -3126,6 +3112,11 @@ void ASTDeclReader::attachPreviousDecl(A
> Previous->IdentifierNamespace &
> (Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Type);
>
> + // If the previous declaration is marked as used, then this declaration should
> + // be too.
> + if (Previous->Used)
> + D->Used = true;
> +
> // If the declaration declares a template, it may inherit default arguments
> // from the previous declaration.
> if (TemplateDecl *TD = dyn_cast<TemplateDecl>(D))
> @@ -3874,7 +3865,7 @@ void ASTDeclReader::UpdateDecl(Decl *D,
> // ASTMutationListeners other than an ASTWriter.
>
> // Maintain AST consistency: any later redeclarations are used too.
> - D->setIsUsed();
> + forAllLaterRedecls(D, [](Decl *D) { D->Used = true; });
> break;
> }
>
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Apr 27 12:26:08 2016
> @@ -5784,13 +5784,8 @@ void ASTWriter::AddedObjCCategoryToInter
>
> void ASTWriter::DeclarationMarkedUsed(const Decl *D) {
> assert(!WritingAST && "Already writing the AST!");
> -
> - // If there is *any* declaration of the entity that's not from an AST file,
> - // we can skip writing the update record. We make sure that isUsed() triggers
> - // completion of the redeclaration chain of the entity.
> - for (auto Prev = D->getMostRecentDecl(); Prev; Prev = Prev->getPreviousDecl())
> - if (IsLocalDecl(Prev))
> - return;
> + if (!D->isFromASTFile())
> + return;
>
> DeclUpdates[D].push_back(DeclUpdate(UPD_DECL_MARKED_USED));
> }
>
> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=267744&r1=267743&r2=267744&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Wed Apr 27 12:26:08 2016
> @@ -1541,6 +1541,16 @@ void ASTDeclWriter::VisitDeclContext(Dec
> }
>
> const Decl *ASTWriter::getFirstLocalDecl(const Decl *D) {
> + /// \brief Is this a local declaration (that is, one that will be written to
> + /// our AST file)? This is the case for declarations that are neither imported
> + /// from another AST file nor predefined.
> + auto IsLocalDecl = [&](const Decl *D) -> bool {
> + if (D->isFromASTFile())
> + return false;
> + auto I = DeclIDs.find(D);
> + return (I == DeclIDs.end() || I->second >= NUM_PREDEF_DECL_IDS);
> + };
> +
> assert(IsLocalDecl(D) && "expected a local declaration");
>
> const Decl *Canon = D->getCanonicalDecl();
>
> Removed: cfe/trunk/test/Modules/pr27401.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/pr27401.cpp?rev=267743&view=auto
> ==============================================================================
> --- cfe/trunk/test/Modules/pr27401.cpp (original)
> +++ cfe/trunk/test/Modules/pr27401.cpp (removed)
> @@ -1,38 +0,0 @@
> -// RUN: rm -rf %t
> -// RUN: %clang_cc1 -std=c++11 -I%S/Inputs/PR27401 -verify %s
> -// RUN: %clang_cc1 -std=c++11 -fmodules -fmodule-map-file=%S/Inputs/PR27401/module.modulemap -fmodules-cache-path=%t -I%S/Inputs/PR27401 -verify %s
> -
> -#include "a.h"
> -#define _LIBCPP_VECTOR
> -template <class, class _Allocator>
> -class __vector_base {
> -protected:
> - _Allocator __alloc() const;
> - __vector_base(_Allocator);
> -};
> -
> -template <class _Tp, class _Allocator = allocator>
> -class vector : __vector_base<_Tp, _Allocator> {
> -public:
> - vector() noexcept(is_nothrow_default_constructible<_Allocator>::value);
> - vector(const vector &);
> - vector(vector &&)
> - noexcept(is_nothrow_move_constructible<_Allocator>::value);
> -};
> -
> -template <class _Tp, class _Allocator>
> -vector<_Tp, _Allocator>::vector(const vector &__x) : __vector_base<_Tp, _Allocator>(__x.__alloc()) {}
> -
> - struct CommentOptions {
> - vector<char> ParseAllComments;
> - CommentOptions() {}
> - };
> - struct PrintingPolicy {
> - PrintingPolicy(CommentOptions LO) : LangOpts(LO) {}
> - CommentOptions LangOpts;
> - };
> -
> -#include "b.h"
> -CommentOptions fn1() { return fn1(); }
> -
> -// expected-no-diagnostics
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list