Set a tentative TLS model in grokvardecl and update TLS mode with the
default TLS access model after a TLS variable has been fully processed
if the default TLS access model is stronger.

gcc/c/

        PR c/107419
        * c-decl.cc (c_decl_attributes): Update TLS model with the
        default TLS access model if the default TLS access model is
        stronger.
        (grokdeclarator): Set a tentative TLS model which will be
        updated by c_decl_attributes later.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/c/c-decl.cc | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 589abf4e4e2..62a0545947e 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -5582,7 +5582,16 @@ c_decl_attributes (tree *node, tree attributes, int 
flags)
   tree last_decl = lookup_last_decl (*node);
   if (last_decl == error_mark_node)
     last_decl = NULL_TREE;
-  return decl_attributes (node, attributes, flags, last_decl);
+  tree attr = decl_attributes (node, attributes, flags, last_decl);
+  if (VAR_P (*node) && DECL_THREAD_LOCAL_P (*node))
+    {
+      // tls_model attribute can set a stronger TLS access model.
+      tls_model model = DECL_TLS_MODEL (*node);
+      tls_model default_model = decl_default_tls_model (*node);
+      if (default_model > model)
+       set_decl_tls_model (*node, default_model);
+    }
+  return attr;
 }
 
 
@@ -8181,8 +8190,11 @@ grokdeclarator (const struct c_declarator *declarator,
            TREE_PUBLIC (decl) = extern_ref;
          }
 
+       // NB: Set a tentative TLS model to avoid tls_model attribute
+       // warnings due to lack of thread storage duration.  It will
+       // be updated by c_decl_attributes later.
        if (threadp)
-         set_decl_tls_model (decl, decl_default_tls_model (decl));
+         set_decl_tls_model (decl, TLS_MODEL_REAL);
       }
 
     if ((storage_class == csc_extern
-- 
2.51.0

Reply via email to