c-decl.c (duplicate_decls): Error out for incompatible TLS declarations.
authorAldy Hernandez <aldyh@redhat.com>
Wed, 7 Aug 2002 01:25:01 +0000 (01:25 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Wed, 7 Aug 2002 01:25:01 +0000 (01:25 +0000)
        * c-decl.c (duplicate_decls): Error out for incompatible TLS
        declarations.

        * testsuite/gcc.dg/tls/diag-3.c: New.

From-SVN: r56084

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tls/diag-3.c [new file with mode: 0644]

index 23f8caa6d8d1595b7269188b2b752feae557d013..3aa4333a63cd2b2c2d4f12c6e8ef322d03f487ff 100644 (file)
@@ -1,3 +1,10 @@
+2002-08-06  Aldy Hernandez  <aldyh@redhat.com>
+
+        * c-decl.c (duplicate_decls): Error out for incompatible TLS
+        declarations.
+
+        * testsuite/gcc.dg/tls/diag-3.c: New.
+
 2002-08-06  Jason Merrill  <jason@redhat.com>
 
        * c-common.c (c_expand_expr) [STMT_EXPR]: If the last expression is
index aed707db6eb61db53c8ddca0369a4eaeb4b57cdc..4adbe69790ec1054675c3155bfdaeff924693b17 100644 (file)
@@ -1400,6 +1400,20 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
        }
       error_with_decl (olddecl, "previous declaration of `%s'");
     }
+  /* TLS cannot follow non-TLS declaration.  */
+  else if (TREE_CODE (olddecl) == VAR_DECL && TREE_CODE (newdecl) == VAR_DECL
+          && !DECL_THREAD_LOCAL (olddecl) && DECL_THREAD_LOCAL (newdecl))
+    {
+      error_with_decl (newdecl, "thread-local declaration of `%s' follows non thread-local declaration");
+      error_with_decl (olddecl, "previous declaration of `%s'");
+    }
+  /* non-TLS declaration cannot follow TLS declaration.  */
+  else if (TREE_CODE (olddecl) == VAR_DECL && TREE_CODE (newdecl) == VAR_DECL
+          && DECL_THREAD_LOCAL (olddecl) && !DECL_THREAD_LOCAL (newdecl))
+    {
+      error_with_decl (newdecl, "non thread-local declaration of `%s' follows thread-local declaration");
+      error_with_decl (olddecl, "previous declaration of `%s'");
+    }
   else
     {
       errmsg = redeclaration_error_message (newdecl, olddecl);
index 0acf870252be3731c857d5065cfd77a24b8b40ac..58171e0d601d0b869c9338b8c5da3e74d34e8739 100644 (file)
@@ -1,3 +1,7 @@
+2002-08-06  Aldy Hernandez  <aldyh@redhat.com>
+
+        * testsuite/gcc.dg/tls/diag-3.c: New.
+
 2002-08-07  Gabriel Dos Reis  <gdr@nerim.net>
 
        * g++.dg/README (Subdirectories): Document new subdir expr.
diff --git a/gcc/testsuite/gcc.dg/tls/diag-3.c b/gcc/testsuite/gcc.dg/tls/diag-3.c
new file mode 100644 (file)
index 0000000..c23b141
--- /dev/null
@@ -0,0 +1,10 @@
+/* Report invalid extern and __thread combinations.  */
+
+extern int j;          /* { dg-error "previous declaration" } */
+__thread int j;                /* { dg-error "thread-local declaration for" } */
+
+extern __thread int i; /* { dg-error "previous declaration" } */
+int i;                 /* { dg-error "non thread-local" } */
+
+extern __thread int k; /* This is fine.  */
+__thread int k;