From c855ce7ab97aa25c609a5f83e19b27289fede21a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 4 Apr 2013 04:40:17 +0000 Subject: Add hasExternalLinkageUncached back with the test that Richard provided, but keep the call at the current location. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178741 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Decl.h | 4 ++++ lib/AST/Decl.cpp | 4 ++++ lib/Sema/SemaDecl.cpp | 14 +++++++++++++- test/Modules/Inputs/linkage-merge-bar.h | 0 test/Modules/Inputs/linkage-merge-foo.h | 1 + test/Modules/Inputs/module.map | 10 ++++++++++ test/Modules/linkage-merge.cpp | 7 +++++++ 7 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/Modules/Inputs/linkage-merge-bar.h create mode 100644 test/Modules/Inputs/linkage-merge-foo.h create mode 100644 test/Modules/linkage-merge.cpp diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 0294b9fde8..7927279ddd 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -219,6 +219,10 @@ public: return getLinkage() == ExternalLinkage; } + /// \brief True if this decl has external linkage. Don't cache the linkage, + /// because we are not finished setting up the redecl chain for the decl. + bool hasExternalLinkageUncached() const; + /// \brief Determines the visibility of this entity. Visibility getVisibility() const { return getLinkageAndVisibility().getVisibility(); diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 9505d299ab..bf807aeb1d 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -866,6 +866,10 @@ bool NamedDecl::isLinkageValid() const { Linkage(CachedLinkage); } +bool NamedDecl::hasExternalLinkageUncached() const { + return getLVForDecl(this, LVForExplicitValue).getLinkage() == ExternalLinkage; +} + Linkage NamedDecl::getLinkage() const { if (HasCachedLinkage) return Linkage(CachedLinkage); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 0ad539ef17..436fca35cb 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1614,7 +1614,19 @@ static void filterNonConflictingPreviousDecls(ASTContext &context, continue; // If either has no-external linkage, ignore the old declaration. - if (old->getLinkage() != ExternalLinkage || !decl->hasExternalLinkage()) + // If this declaration would have external linkage if it were the first + // declaration of this name, then it may in fact be a redeclaration of + // some hidden declaration, so include those too. We don't need to worry + // about some previous visible declaration giving this declaration external + // linkage, because in that case, we'll mark this declaration as a redecl + // of the visible decl, and that decl will already be a redecl of the + // hidden declaration if that's appropriate. + // + // Don't cache this linkage computation, because it's not yet correct: we + // may later give this declaration a previous declaration which changes + // its linkage. + if (old->getLinkage() != ExternalLinkage || + !decl->hasExternalLinkageUncached()) filter.erase(); } diff --git a/test/Modules/Inputs/linkage-merge-bar.h b/test/Modules/Inputs/linkage-merge-bar.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Modules/Inputs/linkage-merge-foo.h b/test/Modules/Inputs/linkage-merge-foo.h new file mode 100644 index 0000000000..7ed7775122 --- /dev/null +++ b/test/Modules/Inputs/linkage-merge-foo.h @@ -0,0 +1 @@ +int f(); diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 595e5d8846..d20521f9c7 100644 --- a/test/Modules/Inputs/module.map +++ b/test/Modules/Inputs/module.map @@ -199,3 +199,13 @@ module builtin { header "builtin_sub.h" } } + +module linkage_merge { + explicit module foo { + header "linkage-merge-foo.h" + } + explicit module bar { + header "linkage-merge-bar.h" + } + +} diff --git a/test/Modules/linkage-merge.cpp b/test/Modules/linkage-merge.cpp new file mode 100644 index 0000000000..dafb0090e7 --- /dev/null +++ b/test/Modules/linkage-merge.cpp @@ -0,0 +1,7 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I %S/Inputs %s + +#include "linkage-merge-bar.h" + +static int f(int); +int f(int); -- cgit v1.2.3-18-g5258