diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-02-15 18:09:18 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-02-15 18:09:18 +0100 |
commit | 4f5e5fcba8a9cbabb0e05f9cb753b549396bc2de (patch) | |
tree | eedc04635f147eb5c3a44a73db1298a990093775 | |
parent | 1eb08f5270794aa13b1f8cfa98c9323914b3011a (diff) | |
download | gcc-4f5e5fcba8a9cbabb0e05f9cb753b549396bc2de.zip gcc-4f5e5fcba8a9cbabb0e05f9cb753b549396bc2de.tar.gz gcc-4f5e5fcba8a9cbabb0e05f9cb753b549396bc2de.tar.bz2 |
re PR c++/79288 (TLS model wrong for static data members since r241137)
PR c++/79288
* decl.c (grokdeclarator): For static data members, handle thread_p
only after handling inline.
* g++.dg/tls/pr79288.C: New test.
From-SVN: r245488
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tls/pr79288.C | 28 |
4 files changed, 48 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7b94d3b..74f5fc9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-02-15 Jakub Jelinek <jakub@redhat.com> + + PR c++/79288 + * decl.c (grokdeclarator): For static data members, handle thread_p + only after handling inline. + 2017-02-14 Marek Polacek <polacek@redhat.com> PR c++/79420 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2292a3a..353e7b5 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12063,14 +12063,6 @@ grokdeclarator (const cp_declarator *declarator, : input_location, VAR_DECL, unqualified_id, type); set_linkage_for_static_data_member (decl); - if (thread_p) - { - CP_DECL_THREAD_LOCAL_P (decl) = true; - if (!processing_template_decl) - set_decl_tls_model (decl, decl_default_tls_model (decl)); - if (declspecs->gnu_thread_keyword_p) - SET_DECL_GNU_TLS_P (decl); - } if (concept_p) error ("static data member %qE declared %<concept%>", unqualified_id); @@ -12091,6 +12083,15 @@ grokdeclarator (const cp_declarator *declarator, definition is provided, unless this is an inline variable. */ DECL_EXTERNAL (decl) = 1; + + if (thread_p) + { + CP_DECL_THREAD_LOCAL_P (decl) = true; + if (!processing_template_decl) + set_decl_tls_model (decl, decl_default_tls_model (decl)); + if (declspecs->gnu_thread_keyword_p) + SET_DECL_GNU_TLS_P (decl); + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d95221a..5df5da8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-15 Jakub Jelinek <jakub@redhat.com> + + PR c++/79288 + * g++.dg/tls/pr79288.C: New test. + 2017-02-15 Marek Polacek <polacek@redhat.com> PR c/79515 diff --git a/gcc/testsuite/g++.dg/tls/pr79288.C b/gcc/testsuite/g++.dg/tls/pr79288.C new file mode 100644 index 0000000..9f488df --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/pr79288.C @@ -0,0 +1,28 @@ +// PR c++/79288 +// { dg-do compile { target nonpic } } +// { dg-require-effective-target tls } +// { dg-options "-O2" } +// { dg-final { scan-assembler-not "@tpoff" { target i?86-*-* x86_64-*-* } } } + +struct S +{ + static __thread int *p; +}; + +template <int N> +struct T +{ + static __thread int *p; +}; + +int * +foo () +{ + return S::p; +} + +int * +bar () +{ + return T<0>::p; +} |