aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-11-08 22:44:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2005-11-08 22:44:58 +0100
commit31a7923695f5540aa1b721f35ab21e471320bda6 (patch)
treec3d8a4d48d1074926a1e30b5347d5e5bdfc1a4b8 /gcc/testsuite
parentda11c5d2261283280dade0b9a7942ed56c4e67de (diff)
downloadgcc-31a7923695f5540aa1b721f35ab21e471320bda6.zip
gcc-31a7923695f5540aa1b721f35ab21e471320bda6.tar.gz
gcc-31a7923695f5540aa1b721f35ab21e471320bda6.tar.bz2
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
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/tls/diag-3.C10
-rw-r--r--gcc/testsuite/g++.dg/tls/diag-4.C9
-rw-r--r--gcc/testsuite/g++.dg/tls/static-1.C28
-rw-r--r--gcc/testsuite/g++.dg/tls/static-1a.cc18
5 files changed, 73 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6444335..8058bb8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2005-11-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/19450
+ * 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.
+
2005-11-08 Diego Novillo <dnovillo@redhat.com>
PR 23046
diff --git a/gcc/testsuite/g++.dg/tls/diag-3.C b/gcc/testsuite/g++.dg/tls/diag-3.C
new file mode 100644
index 0000000..ae2b6ce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/diag-3.C
@@ -0,0 +1,10 @@
+// Report invalid extern and __thread combinations.
+
+extern int j; // { dg-error "previously declared here" }
+__thread int j; // { dg-error "follows non-thread-local" }
+
+extern __thread int i; // { dg-error "previously declared here" }
+int i; // { dg-error "follows thread-local" }
+
+extern __thread int k; // This is fine.
+__thread int k;
diff --git a/gcc/testsuite/g++.dg/tls/diag-4.C b/gcc/testsuite/g++.dg/tls/diag-4.C
new file mode 100644
index 0000000..3b840f1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/diag-4.C
@@ -0,0 +1,9 @@
+/* Invalid __thread specifiers. */
+
+__thread typedef int g4; /* { dg-error "multiple storage classes" } */
+
+void foo()
+{
+ __thread auto int l2; /* { dg-error "multiple storage classes" } */
+ __thread register int l4; /* { dg-error "multiple storage classes" } */
+}
diff --git a/gcc/testsuite/g++.dg/tls/static-1.C b/gcc/testsuite/g++.dg/tls/static-1.C
new file mode 100644
index 0000000..3cbcbec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/static-1.C
@@ -0,0 +1,28 @@
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "static-1a.cc" }
+
+extern "C" void abort ();
+extern int test ();
+
+struct A
+{
+ static __thread int i;
+};
+
+__thread int A::i = 8;
+
+int
+main ()
+{
+ if (A::i != 8)
+ abort ();
+
+ if (test ())
+ abort ();
+
+ if (A::i != 17)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/tls/static-1a.cc b/gcc/testsuite/g++.dg/tls/static-1a.cc
new file mode 100644
index 0000000..c87efdb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/static-1a.cc
@@ -0,0 +1,18 @@
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "static-1a.cc" }
+
+struct A
+{
+ static __thread int i;
+};
+
+int
+test ()
+{
+ if (A::i != 8)
+ return 1;
+
+ A::i = 17;
+ return 0;
+}