On Tue, Aug 12, 2025 at 4:19 PM Jason Merrill <ja...@redhat.com> wrote: > > On 8/1/25 4:56 AM, H.J. Lu wrote: > > Set a tentative TLS model in grokvardecl and update DECL_TLS_MODEL with > > the default TLS access model after a TLS variable has been fully processed > > if the default TLS access model is stronger. > > > > gcc/cp/ > > > > PR c++/107393 > > * decl.cc (grokvardecl): Add a pointer to bool argument to > > indicate if DECL_TLS_MODEL should be updated later. Set a > > tentative TLS model if DECL_TLS_MODEL will be updated later. > > (start_decl): Pass a pointer to bool argument to grokdeclarator. > > Call set_decl_tls_model to update DECL_TLS_MODEL with the default > > TLS access model after calling grokdeclarator if the default TLS > > access model is stronger. > > (grokdeclarator): Add a pointer to bool argument and pass it to > > grokvardecl. > > * decl.h (grokdeclarator): Add a pointer to bool argument and > > default it to nullptr. > > * pt.cc (tsubst_decl): Call set_decl_tls_model after processing > > a variable. > > The tests pass with only the pt.cc changes, do you have an example that
There are 3 tests submitted with the C frontend patch: https://patchwork.sourceware.org/project/gcc/patch/20250801115455.1024683-1-hjl.to...@gmail.com/ These tests are common to both C and C++. One of them looks like: [hjl@gnu-cfl-3 testsuite]$ cat c-c++-common/tls-attr-le-pic.c /* { dg-do compile } */ /* { dg-require-effective-target fpic } */ /* { dg-require-effective-target tls } */ /* { dg-options "-O2 -fpic -fdump-ipa-whole-program" } */ __attribute__ ((tls_model ("local-exec"))) __thread int i; int * foo (void) { return &i; } /* tls_model should be local-exec due to tls_model attribute. */ /* { dg-final { scan-ipa-dump "Varpool flags: tls-local-exec" "whole-program" } } */ [hjl@gnu-cfl-3 testsuite]$ > motivates the other changes? I'd rather not add this sort of pass-back > parameter. > > > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc > > index acfeb816592..e053f2453ab 100644 > > --- a/gcc/cp/pt.cc > > +++ b/gcc/cp/pt.cc > > @@ -15934,6 +15934,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t > > complain, > > if (type == error_mark_node && !(complain & tf_error)) > > RETURN (error_mark_node); > > r = copy_decl (t); > > + bool need_tls_model = false; > > if (VAR_P (r)) > > { > > DECL_INITIALIZED_P (r) = 0; > > @@ -15994,7 +15995,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t > > complain, > > } > > if (CP_DECL_THREAD_LOCAL_P (r) > > && !processing_template_decl) > > - set_decl_tls_model (r, decl_default_tls_model (r)); > > + need_tls_model = true; > > } > > else if (DECL_SELF_REFERENCE_P (t)) > > SET_DECL_SELF_REFERENCE_P (r); > > @@ -16057,6 +16058,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t > > complain, > > register_local_specialization (r, t); > > } > > > > + if (need_tls_model) > > + set_decl_tls_model (r, decl_default_tls_model (r)); > > I don't see the need for a new variable, we could move the existing > tests (plus VAR_P) down along with the set? I will check it out. Thanks. > Jason > -- H.J.