On 9/30/21 11:45, Jakub Jelinek wrote:
On Thu, Sep 30, 2021 at 08:06:52AM -0400, Jason Merrill wrote:
Hmm, what if decl has the tls_model attribute?

We could decide not to push the alias for a thread-local variable when
processing_template_decl, like we don't if the type is dependent; in either
case we'll push it at instantiation time.

So like this (assuming it passes full bootstrap/regtest, so far it passed
tls.exp)?

OK.

2021-09-28  Jakub Jelinek  <ja...@redhat.com>

        PR c++/102496
        * name-lookup.c (push_local_extern_decl_alias): Return early even for
        tls vars with non-dependent type when processing_template_decl.  For
        CP_DECL_THREAD_LOCAL_P vars call set_decl_tls_model on alias.

        * g++.dg/tls/pr102496-1.C: New test.
        * g++.dg/tls/pr102496-2.C: New test.

--- gcc/cp/name-lookup.c.jj     2021-09-29 10:07:28.838061585 +0200
+++ gcc/cp/name-lookup.c        2021-09-30 17:30:46.010100552 +0200
@@ -3375,7 +3375,10 @@ set_decl_context_in_fn (tree ctx, tree d
  void
  push_local_extern_decl_alias (tree decl)
  {
-  if (dependent_type_p (TREE_TYPE (decl)))
+  if (dependent_type_p (TREE_TYPE (decl))
+      || (processing_template_decl
+         && VAR_P (decl)
+         && CP_DECL_THREAD_LOCAL_P (decl)))
      return;
    /* EH specs were not part of the function type prior to c++17, but
       we still can't go pushing dependent eh specs into the namespace.  */
@@ -3471,6 +3474,8 @@ push_local_extern_decl_alias (tree decl)
          push_nested_namespace (ns);
          alias = do_pushdecl (alias, /* hiding= */true);
          pop_nested_namespace (ns);
+         if (VAR_P (decl) && CP_DECL_THREAD_LOCAL_P (decl))
+           set_decl_tls_model (alias, DECL_TLS_MODEL (decl));
        }
      }
--- gcc/testsuite/g++.dg/tls/pr102496-1.C.jj 2021-09-30 17:22:47.867769063 +0200
+++ gcc/testsuite/g++.dg/tls/pr102496-1.C       2021-09-30 17:22:47.867769063 
+0200
@@ -0,0 +1,20 @@
+// PR c++/102496
+// { dg-do link { target c++11 } }
+// { dg-require-effective-target tls }
+// { dg-add-options tls }
+// { dg-additional-sources pr102496-2.C }
+
+template <int N>
+int
+foo ()
+{
+  extern __thread int t1;
+  return t1;
+}
+
+int
+main ()
+{
+  extern __thread int t2;
+  return foo <0> () + t2;
+}
--- gcc/testsuite/g++.dg/tls/pr102496-2.C.jj    2021-09-30 17:22:47.867769063 
+0200
+++ gcc/testsuite/g++.dg/tls/pr102496-2.C       2021-09-30 17:22:47.867769063 
+0200
@@ -0,0 +1,6 @@
+// PR c++/102496
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+__thread int t1;
+__thread int t2;


        Jakub


Reply via email to