From 31a7923695f5540aa1b721f35ab21e471320bda6 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 8 Nov 2005 22:44:58 +0100 Subject: re PR c++/19450 (__thread static class members) PR c++/19450 * decl.c (redeclaration_error_message): Issue diagnostics about olddecl and newdecl disagreement on __thread property. (grokdeclarator): Set DECL_TLS_MODEL on class static variables. * g++.dg/tls/diag-3.C: New test. * g++.dg/tls/diag-4.C: New test. * g++.dg/tls/static-1.C: New test. * g++.dg/tls/static-1a.cc: New file. From-SVN: r106657 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/decl.c | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'gcc/cp') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1b2d166..bcbddc7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2005-11-08 Jakub Jelinek + + PR c++/19450 + * decl.c (redeclaration_error_message): Issue diagnostics about + olddecl and newdecl disagreement on __thread property. + (grokdeclarator): Set DECL_TLS_MODEL on class static variables. + 2005-11-08 Jason Merrill PR c++/21123 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c5fe658..7263b32 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2014,6 +2014,18 @@ redeclaration_error_message (tree newdecl, tree olddecl) return NULL; } + else if (TREE_CODE (newdecl) == VAR_DECL + && DECL_THREAD_LOCAL_P (newdecl) != DECL_THREAD_LOCAL_P (olddecl)) + { + /* Only variables can be thread-local, and all declarations must + agree on this property. */ + if (DECL_THREAD_LOCAL_P (newdecl)) + return "thread-local declaration of %q#D follows " + "non-thread-local declaration"; + else + return "non-thread-local declaration of %q#D follows " + "thread-local declaration"; + } else if (toplevel_bindings_p () || DECL_NAMESPACE_SCOPE_P (newdecl)) { /* Objects declared at top level: */ @@ -8216,6 +8228,17 @@ grokdeclarator (const cp_declarator *declarator, is considered undefined until an out-of-class definition is provided. */ DECL_EXTERNAL (decl) = 1; + + if (thread_p) + { + if (targetm.have_tls) + DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + else + /* A mere warning is sure to result in improper + semantics at runtime. Don't bother to allow this to + compile. */ + error ("thread-local storage not supported for this target"); + } } else { -- cgit v1.1