diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-09-10 12:47:47 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2025-09-11 05:33:40 -0700 |
commit | 0b0ffa44c1881a52e5c624d369a090403919e61a (patch) | |
tree | ba133adcb38811bec53a676818e5405565ce16ca | |
parent | b996d4509f1724d92a08dae70d8354fbb5561fb7 (diff) | |
download | gcc-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.cc | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tls/pr121889.C | 9 |
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; } |