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