aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2025-09-10 12:47:47 -0700
committerH.J. Lu <hjl.tools@gmail.com>2025-09-11 05:33:40 -0700
commit0b0ffa44c1881a52e5c624d369a090403919e61a (patch)
treeba133adcb38811bec53a676818e5405565ce16ca
parentb996d4509f1724d92a08dae70d8354fbb5561fb7 (diff)
downloadgcc-0b0ffa44c1881a52e5c624d369a090403919e61a.zip
gcc-0b0ffa44c1881a52e5c624d369a090403919e61a.tar.gz
gcc-0b0ffa44c1881a52e5c624d369a090403919e61a.tar.bz2
c++: Don't upgrade TLS model if TLS model isn't set.
Don't upgrade TLS model when cplus_decl_attributes is called on a thread local variable whose TLS model isn't set yet. gcc/cp/ PR c++/121889 * decl2.cc (cplus_decl_attributes): Don't upgrade TLS model if TLS model isn't set yet. gcc/testsuite/ PR c++/121889 * g++.dg/tls/pr121889.C: New test. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
-rw-r--r--gcc/cp/decl2.cc10
-rw-r--r--gcc/testsuite/g++.dg/tls/pr121889.C9
2 files changed, 16 insertions, 3 deletions
diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index c9cca7b..4564fdc 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -2018,9 +2018,13 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
{
// tls_model attribute can set a stronger TLS access model.
tls_model model = DECL_TLS_MODEL (*decl);
- tls_model default_model = decl_default_tls_model (*decl);
- if (default_model > model)
- set_decl_tls_model (*decl, default_model);
+ // Don't upgrade TLS model if TLS model isn't set yet.
+ if (model != TLS_MODEL_NONE)
+ {
+ tls_model default_model = decl_default_tls_model (*decl);
+ if (default_model > model)
+ set_decl_tls_model (*decl, default_model);
+ }
}
}
diff --git a/gcc/testsuite/g++.dg/tls/pr121889.C b/gcc/testsuite/g++.dg/tls/pr121889.C
new file mode 100644
index 0000000..881855a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/pr121889.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+// { dg-options "-O2" }
+// { dg-add-options tls }
+
+extern void pthread_key_create();
+static __typeof(pthread_key_create) __gthrw___pthread_key_create
+ __attribute__((__weakref__("")));
+template <class> void zeta_imp_odd_integer() { thread_local int digits; }