On Tue, Aug 26, 2014 at 03:38:43PM -0400, Jason Merrill wrote:
> commit ccf3f3b41516b34d7d564bed1b3f4e3cf270e43a
> Author: Jason Merrill <[email protected]>
> Date: Tue Aug 26 13:56:17 2014 -0400
>
> PR c++/58624
> * pt.c (tsubst_decl) [VAR_DECL]: Copy TLS model.
> (tsubst_copy_and_build) [VAR_DECL]: Use TLS wrapper.
> * semantics.c (finish_id_expression): Don't call TLS wrapper in a
> template.
>
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/tls/thread_local10.C
> @@ -0,0 +1,23 @@
> +// PR c++/58624
> +
> +// { dg-do run { target c++11 } }
> +// { dg-add-options tls }
> +// { dg-require-effective-target tls_runtime }
> +
> +int i;
> +
> +template <typename> struct A
> +{
> + static thread_local int s;
> +
> + A () { i = s; }
> +};
> +
> +int f() { return 42; }
> +template <typename T> thread_local int A<T>::s = f();
> +
> +int main () {
> + A<void> a;
> + if (i != 42)
> + __builtin_abort();
> +}
Note that this has been committed to 4.8 branch too in r216273,
but there this testcase FAILs:
thread_local10.C:11:10: error: ‘thread_local’ does not name a type
static thread_local int s;
^
thread_local10.C: In constructor ‘A< <template-parameter-1-1> >::A()’:
thread_local10.C:13:14: error: ‘s’ was not declared in this scope
A () { i = s; }
^
thread_local10.C: At global scope:
thread_local10.C:17:23: error: ‘thread_local’ does not name a type
template <typename T> thread_local int A<T>::s = f();
^
The problem is that something adds -ansi -pedantic-errors after the
-std=c++11, but I couldn't figure out what. Perhaps just use
// { dg-options "" } before dg-add-options?
Jakub