<div dir="auto"><div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 14 May 2019, 03:09 Hans Wennborg 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">Actually, we didn't notice r359260 in Chromium, however this one<br>
(r360637) caused Clang to start asserting during our builds<br>
(<a href="https://bugs.chromium.org/p/chromium/issues/detail?id=962840" rel="noreferrer noreferrer" target="_blank">https://bugs.chromium.org/p/chromium/issues/detail?id=962840</a>), here's<br>
a reduced test case:<br>
<br>
--<br>
extern int a;<br>
static int *use1 = &a;<br>
int **use2 = &use1;<br>
static int a = 0;<br>
--<br>
<br>
$ clang.bad -cc1 -triple i386-pc-windows-msvc19.11.0 -emit-obj<br>
-fms-extensions /tmp/a.cc<br>
clang.bad: /work/llvm.monorepo/clang/lib/AST/Decl.cpp:1494:<br>
clang::LinkageInfo clang::LinkageComputer::getLVForDecl(const<br>
clang::NamedDecl*, clang::LVComputationKind): Assertion<br>
`D->getCachedLinkage() == LV.getLinkage()' failed.<br>
<br>
<br>
I've reverted this one in r360657 in the meantime.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Yep, I'm not at all surprised. Perhaps we should stop claiming to support this extension, given that it fundamentally violates assumptions made by clang (that linkage doesn't change after the first declaration). Presumably we instead used to miscompile the example you give above (and after the revert, miscompile it again now)?</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a>><br>
Date: Tue, May 14, 2019 at 2:24 AM<br>
To: <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a>><br>
<br>
> Author: rsmith<br>
> Date: Mon May 13 17:27:16 2019<br>
> New Revision: 360637<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=360637&view=rev" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=360637&view=rev</a><br>
> Log:<br>
> PR41817: Fix regression in r359260 that caused the MS compatibility<br>
> extension allowing a "static" declaration to follow an "extern"<br>
> declaration to stop working.<br>
><br>
> Added:<br>
>     cfe/trunk/test/CodeGen/ms-compat-extern-static.c<br>
> Modified:<br>
>     cfe/trunk/lib/AST/Decl.cpp<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=360637&r1=360636&r2=360637&view=diff" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=360637&r1=360636&r2=360637&view=diff</a><br>
> ==============================================================================<br>
> --- cfe/trunk/lib/AST/Decl.cpp (original)<br>
> +++ cfe/trunk/lib/AST/Decl.cpp Mon May 13 17:27:16 2019<br>
> @@ -613,12 +613,41 @@ static LinkageInfo getExternalLinkageFor<br>
>  static StorageClass getStorageClass(const Decl *D) {<br>
>    if (auto *TD = dyn_cast<TemplateDecl>(D))<br>
>      D = TD->getTemplatedDecl();<br>
> -  if (D) {<br>
> -    if (auto *VD = dyn_cast<VarDecl>(D))<br>
> -      return VD->getStorageClass();<br>
> -    if (auto *FD = dyn_cast<FunctionDecl>(D))<br>
> -      return FD->getStorageClass();<br>
> +  if (!D)<br>
> +    return SC_None;<br>
> +<br>
> +  if (auto *VD = dyn_cast<VarDecl>(D)) {<br>
> +    // Generally, the storage class is determined by the first declaration.<br>
> +    auto SC = VD->getCanonicalDecl()->getStorageClass();<br>
> +<br>
> +    // ... except that MSVC permits an 'extern' declaration to be redeclared<br>
> +    // 'static' as an extension.<br>
> +    if (SC == SC_Extern) {<br>
> +      for (auto *Redecl : VD->redecls()) {<br>
> +        if (Redecl->getStorageClass() == SC_Static)<br>
> +          return SC_Static;<br>
> +        if (Redecl->getStorageClass() != SC_Extern &&<br>
> +            !Redecl->isLocalExternDecl() && !Redecl->getFriendObjectKind())<br>
> +          break;<br>
> +      }<br>
> +    }<br>
> +    return SC;<br>
>    }<br>
> +<br>
> +  if (auto *FD = dyn_cast<FunctionDecl>(D)) {<br>
> +    auto SC = FD->getCanonicalDecl()->getStorageClass();<br>
> +    if (SC == SC_Extern) {<br>
> +      for (auto *Redecl : FD->redecls()) {<br>
> +        if (Redecl->getStorageClass() == SC_Static)<br>
> +          return SC_Static;<br>
> +        if (Redecl->getStorageClass() != SC_Extern &&<br>
> +            !Redecl->isLocalExternDecl() && !Redecl->getFriendObjectKind())<br>
> +          break;<br>
> +      }<br>
> +    }<br>
> +    return SC;<br>
> +  }<br>
> +<br>
>    return SC_None;<br>
>  }<br>
><br>
> @@ -634,7 +663,7 @@ LinkageComputer::getLVForNamespaceScopeD<br>
>    //   A name having namespace scope (3.3.6) has internal linkage if it<br>
>    //   is the name of<br>
><br>
> -  if (getStorageClass(D->getCanonicalDecl()) == SC_Static) {<br>
> +  if (getStorageClass(D) == SC_Static) {<br>
>      // - a variable, variable template, function, or function template<br>
>      //   that is explicitly declared static; or<br>
>      // (This bullet corresponds to C99 6.2.2p3.)<br>
><br>
> Added: cfe/trunk/test/CodeGen/ms-compat-extern-static.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-compat-extern-static.c?rev=360637&view=auto" rel="noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-compat-extern-static.c?rev=360637&view=auto</a><br>
> ==============================================================================<br>
> --- cfe/trunk/test/CodeGen/ms-compat-extern-static.c (added)<br>
> +++ cfe/trunk/test/CodeGen/ms-compat-extern-static.c Mon May 13 17:27:16 2019<br>
> @@ -0,0 +1,11 @@<br>
> +// RUN: %clang_cc1 -emit-llvm %s -o - -fms-extensions -triple x86_64-windows | FileCheck %s<br>
> +<br>
> +// CHECK: @n = internal global i32 1<br>
> +extern int n;<br>
> +static int n = 1;<br>
> +int *use = &n;<br>
> +<br>
> +// CHECK: define internal void @f(<br>
> +extern void f();<br>
> +static void f() {}<br>
> +void g() { return f(); }<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div>