r181627 - Avoid patching storage class for block scope thread_local variables.
Richard Smith
richard at metafoo.co.uk
Mon May 13 23:48:53 PDT 2013
This caused PR15991. You're missing an update to
CodeGenFunction::EmitVarDecl.
On Fri, May 10, 2013 at 1:34 PM, Enea Zaffanella <zaffanella at cs.unipr.it>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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130513/6c11a67c/attachment.html>
More information about the cfe-commits
mailing list