This caused PR15991. You're missing an update to CodeGenFunction::EmitVarDecl.<br><br><div class="gmail_quote">On Fri, May 10, 2013 at 1:34 PM, Enea Zaffanella <span dir="ltr"><<a href="mailto:zaffanella@cs.unipr.it" target="_blank">zaffanella@cs.unipr.it</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: enea<br>
Date: Fri May 10 15:34:44 2013<br>
New Revision: 181627<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=181627&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=181627&view=rev</a><br>
Log:<br>
Avoid patching storage class for block scope thread_local variables.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/Decl.h<br>
    cfe/trunk/lib/Sema/SemaDecl.cpp<br>
    cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/Decl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=181627&r1=181626&r2=181627&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=181627&r1=181626&r2=181627&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/AST/Decl.h (original)<br>
+++ cfe/trunk/include/clang/AST/Decl.h Fri May 10 15:34:44 2013<br>
@@ -797,7 +797,8 @@ public:<br>
   ///  is a non-static local variable.<br>
   bool hasLocalStorage() const {<br>
     if (getStorageClass() == SC_None)<br>
-      return !isFileVarDecl();<br>
+      // Second check is for C++11 [dcl.stc]p4.<br>
+      return !isFileVarDecl() && getTSCSpec() != TSCS_thread_local;<br>
<br>
     // Return true for:  Auto, Register.<br>
     // Return false for: Extern, Static, PrivateExtern, OpenCLWorkGroupLocal.<br>
@@ -808,7 +809,10 @@ public:<br>
   /// isStaticLocal - Returns true if a variable with function scope is a<br>
   /// static local variable.<br>
   bool isStaticLocal() const {<br>
-    return getStorageClass() == SC_Static && !isFileVarDecl();<br>
+    return (getStorageClass() == SC_Static ||<br>
+            // C++11 [dcl.stc]p4<br>
+            (getStorageClass() == SC_None && getTSCSpec() == TSCS_thread_local))<br>
+      && !isFileVarDecl();<br>
   }<br>
<br>
   /// \brief Returns true if a variable has extern or __private_extern__<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=181627&r1=181626&r2=181627&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=181627&r1=181626&r2=181627&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri May 10 15:34:44 2013<br>
@@ -4718,16 +4718,6 @@ Sema::ActOnVariableDeclarator(Scope *S,<br>
     SC = SC_None;<br>
   }<br>
<br>
-  // C++11 [dcl.stc]p4:<br>
-  //   When thread_local is applied to a variable of block scope the<br>
-  //   storage-class-specifier static is implied if it does not appear<br>
-  //   explicitly.<br>
-  // Core issue: 'static' is not implied if the variable is declared 'extern'.<br>
-  if (SCSpec == DeclSpec::SCS_unspecified &&<br>
-      D.getDeclSpec().getThreadStorageClassSpec() ==<br>
-          DeclSpec::TSCS_thread_local && DC->isFunctionOrMethod())<br>
-    SC = SC_Static;<br>
-<br>
   IdentifierInfo *II = Name.getAsIdentifierInfo();<br>
   if (!II) {<br>
     Diag(D.getIdentifierLoc(), diag::err_bad_variable_name)<br>
@@ -4885,11 +4875,22 @@ Sema::ActOnVariableDeclarator(Scope *S,<br>
   NewVD->setLexicalDeclContext(CurContext);<br>
<br>
   if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec()) {<br>
-    if (NewVD->hasLocalStorage())<br>
-      Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),<br>
-           diag::err_thread_non_global)<br>
-        << DeclSpec::getSpecifierName(TSCS);<br>
-    else if (!Context.getTargetInfo().isTLSSupported())<br>
+    if (NewVD->hasLocalStorage()) {<br>
+      // C++11 [dcl.stc]p4:<br>
+      //   When thread_local is applied to a variable of block scope the<br>
+      //   storage-class-specifier static is implied if it does not appear<br>
+      //   explicitly.<br>
+      // Core issue: 'static' is not implied if the variable is declared<br>
+      //   'extern'.<br>
+      if (SCSpec == DeclSpec::SCS_unspecified &&<br>
+          TSCS == DeclSpec::TSCS_thread_local &&<br>
+          DC->isFunctionOrMethod())<br>
+        NewVD->setTSCSpec(TSCS);<br>
+      else<br>
+        Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),<br>
+             diag::err_thread_non_global)<br>
+          << DeclSpec::getSpecifierName(TSCS);<br>
+    } else if (!Context.getTargetInfo().isTLSSupported())<br>
       Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),<br>
            diag::err_thread_unsupported);<br>
     else<br>
@@ -5237,7 +5238,7 @@ void Sema::CheckVariableDeclarationType(<br>
       if (NewVD->isFileVarDecl())<br>
         Diag(NewVD->getLocation(), diag::err_vla_decl_in_file_scope)<br>
         << SizeRange;<br>
-      else if (NewVD->getStorageClass() == SC_Static)<br>
+      else if (NewVD->isStaticLocal())<br>
         Diag(NewVD->getLocation(), diag::err_vla_decl_has_static_storage)<br>
         << SizeRange;<br>
       else<br>
<br>
Modified: cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp?rev=181627&r1=181626&r2=181627&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp?rev=181627&r1=181626&r2=181627&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp Fri May 10 15:34:44 2013<br>
@@ -7,3 +7,9 @@ __thread int gnu_tl;<br>
 _Thread_local int c11_tl;<br>
 thread_local int cxx11_tl;<br>
<br>
+// CHECK: void foo() {<br>
+// CHECK:     thread_local int cxx11_tl;<br>
+// CHECK: }<br>
+void foo() {<br>
+    thread_local int cxx11_tl;<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br>