r315256 - [Modules TS] Avoid computing the linkage of the enclosing DeclContext for a declaration in the global module.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 9 17:49:38 PDT 2017
Author: rsmith
Date: Mon Oct 9 17:49:38 2017
New Revision: 315256
URL: http://llvm.org/viewvc/llvm-project?rev=315256&view=rev
Log:
[Modules TS] Avoid computing the linkage of the enclosing DeclContext for a declaration in the global module.
This works around a language issue where adding a typedef name for linkage
purposes changes the linkage of an already-defined class after it becomes
complete.
Added:
cfe/trunk/test/Modules/anon-linkage.cpp
Modified:
cfe/trunk/include/clang/AST/DeclBase.h
cfe/trunk/include/clang/Sema/Sema.h
cfe/trunk/lib/AST/Decl.cpp
Modified: cfe/trunk/include/clang/AST/DeclBase.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=315256&r1=315255&r2=315256&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclBase.h (original)
+++ cfe/trunk/include/clang/AST/DeclBase.h Mon Oct 9 17:49:38 2017
@@ -740,7 +740,10 @@ public:
/// Get the module that owns this declaration for linkage purposes.
/// There only ever is such a module under the C++ Modules TS.
- Module *getOwningModuleForLinkage() const;
+ ///
+ /// \param IgnoreLinkage Ignore the linkage of the entity; assume that
+ /// all declarations in a global module fragment are unowned.
+ Module *getOwningModuleForLinkage(bool IgnoreLinkage = false) const;
/// \brief Determine whether this declaration might be hidden from name
/// lookup. Note that the declaration might be visible even if this returns
Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=315256&r1=315255&r2=315256&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Mon Oct 9 17:49:38 2017
@@ -3051,8 +3051,11 @@ public:
RedeclarationKind forRedeclarationInCurContext() {
// A declaration with an owning module for linkage can never link against
- // anything that is not visible.
- if (cast<Decl>(CurContext)->getOwningModuleForLinkage())
+ // anything that is not visible. We don't need to check linkage here; if
+ // the context has internal linkage, redeclaration lookup won't find things
+ // from other TUs, and we can't safely compute linkage yet in general.
+ if (cast<Decl>(CurContext)
+ ->getOwningModuleForLinkage(/*IgnoreLinkage*/true))
return ForVisibleRedeclaration;
return ForExternalRedeclaration;
}
Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=315256&r1=315255&r2=315256&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Mon Oct 9 17:49:38 2017
@@ -1395,7 +1395,7 @@ LinkageInfo LinkageComputer::getDeclLink
: NamedDecl::VisibilityForValue));
}
-Module *Decl::getOwningModuleForLinkage() const {
+Module *Decl::getOwningModuleForLinkage(bool IgnoreLinkage) const {
Module *M = getOwningModule();
if (!M)
return nullptr;
@@ -1413,6 +1413,8 @@ Module *Decl::getOwningModuleForLinkage(
// for linkage purposes. But internal linkage declarations in the global
// module fragment of a particular module are owned by that module for
// linkage purposes.
+ if (IgnoreLinkage)
+ return nullptr;
bool InternalLinkage;
if (auto *ND = dyn_cast<NamedDecl>(this))
InternalLinkage = !ND->hasExternalFormalLinkage();
Added: cfe/trunk/test/Modules/anon-linkage.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/anon-linkage.cpp?rev=315256&view=auto
==============================================================================
--- cfe/trunk/test/Modules/anon-linkage.cpp (added)
+++ cfe/trunk/test/Modules/anon-linkage.cpp Mon Oct 9 17:49:38 2017
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++17 -fmodules-ts %s
+
+typedef struct {
+ int c;
+ union {
+ int n;
+ char c[4];
+ } v;
+} mbstate;
+
+export module M;
+export using ::mbstate;
More information about the cfe-commits
mailing list