This caused PR15991. You're missing an update to CodeGenFunction::EmitVarDecl.
On Fri, May 10, 2013 at 1:34 PM, Enea Zaffanella <[email protected]>wrote: > Author: enea > Date: Fri May 10 15:34:44 2013 > New Revision: 181627 > > URL: http://llvm.org/viewvc/llvm-project?rev=181627&view=rev > Log: > Avoid patching storage class for block scope thread_local variables. > > Modified: > cfe/trunk/include/clang/AST/Decl.h > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp > > Modified: cfe/trunk/include/clang/AST/Decl.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=181627&r1=181626&r2=181627&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Decl.h (original) > +++ cfe/trunk/include/clang/AST/Decl.h Fri May 10 15:34:44 2013 > @@ -797,7 +797,8 @@ public: > /// is a non-static local variable. > bool hasLocalStorage() const { > if (getStorageClass() == SC_None) > - return !isFileVarDecl(); > + // Second check is for C++11 [dcl.stc]p4. > + return !isFileVarDecl() && getTSCSpec() != TSCS_thread_local; > > // Return true for: Auto, Register. > // Return false for: Extern, Static, PrivateExtern, > OpenCLWorkGroupLocal. > @@ -808,7 +809,10 @@ public: > /// isStaticLocal - Returns true if a variable with function scope is a > /// static local variable. > bool isStaticLocal() const { > - return getStorageClass() == SC_Static && !isFileVarDecl(); > + return (getStorageClass() == SC_Static || > + // C++11 [dcl.stc]p4 > + (getStorageClass() == SC_None && getTSCSpec() == > TSCS_thread_local)) > + && !isFileVarDecl(); > } > > /// \brief Returns true if a variable has extern or __private_extern__ > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=181627&r1=181626&r2=181627&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri May 10 15:34:44 2013 > @@ -4718,16 +4718,6 @@ Sema::ActOnVariableDeclarator(Scope *S, > SC = SC_None; > } > > - // C++11 [dcl.stc]p4: > - // When thread_local is applied to a variable of block scope the > - // storage-class-specifier static is implied if it does not appear > - // explicitly. > - // Core issue: 'static' is not implied if the variable is declared > 'extern'. > - if (SCSpec == DeclSpec::SCS_unspecified && > - D.getDeclSpec().getThreadStorageClassSpec() == > - DeclSpec::TSCS_thread_local && DC->isFunctionOrMethod()) > - SC = SC_Static; > - > IdentifierInfo *II = Name.getAsIdentifierInfo(); > if (!II) { > Diag(D.getIdentifierLoc(), diag::err_bad_variable_name) > @@ -4885,11 +4875,22 @@ Sema::ActOnVariableDeclarator(Scope *S, > NewVD->setLexicalDeclContext(CurContext); > > if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec()) { > - if (NewVD->hasLocalStorage()) > - Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(), > - diag::err_thread_non_global) > - << DeclSpec::getSpecifierName(TSCS); > - else if (!Context.getTargetInfo().isTLSSupported()) > + if (NewVD->hasLocalStorage()) { > + // C++11 [dcl.stc]p4: > + // When thread_local is applied to a variable of block scope the > + // storage-class-specifier static is implied if it does not appear > + // explicitly. > + // Core issue: 'static' is not implied if the variable is declared > + // 'extern'. > + if (SCSpec == DeclSpec::SCS_unspecified && > + TSCS == DeclSpec::TSCS_thread_local && > + DC->isFunctionOrMethod()) > + NewVD->setTSCSpec(TSCS); > + else > + Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(), > + diag::err_thread_non_global) > + << DeclSpec::getSpecifierName(TSCS); > + } else if (!Context.getTargetInfo().isTLSSupported()) > Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(), > diag::err_thread_unsupported); > else > @@ -5237,7 +5238,7 @@ void Sema::CheckVariableDeclarationType( > if (NewVD->isFileVarDecl()) > Diag(NewVD->getLocation(), diag::err_vla_decl_in_file_scope) > << SizeRange; > - else if (NewVD->getStorageClass() == SC_Static) > + else if (NewVD->isStaticLocal()) > Diag(NewVD->getLocation(), diag::err_vla_decl_has_static_storage) > << SizeRange; > else > > Modified: cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp?rev=181627&r1=181626&r2=181627&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp (original) > +++ cfe/trunk/test/SemaCXX/cxx11-thread-local-print.cpp Fri May 10 > 15:34:44 2013 > @@ -7,3 +7,9 @@ __thread int gnu_tl; > _Thread_local int c11_tl; > thread_local int cxx11_tl; > > +// CHECK: void foo() { > +// CHECK: thread_local int cxx11_tl; > +// CHECK: } > +void foo() { > + thread_local int cxx11_tl; > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
