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