OSDN Git Service

PR c++/30536
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 2 Feb 2007 12:23:18 +0000 (12:23 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 2 Feb 2007 12:23:18 +0000 (12:23 +0000)
* decl.c (grokdeclarator): If __thread is used together with
a storage class other than extern and static, clear thread_p
after issuing diagnostics and fall through to checking the
storage class.

* g++.dg/tls/diag-5.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121496 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tls/diag-5.C [new file with mode: 0644]

index c89e383..47ac05f 100644 (file)
@@ -1,3 +1,11 @@
+2007-02-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/30536
+       * decl.c (grokdeclarator): If __thread is used together with
+       a storage class other than extern and static, clear thread_p
+       after issuing diagnostics and fall through to checking the
+       storage class.
+
 2007-01-30  Roger Sayle  <roger@eyesopen.com>
 
        * error.c (dump_type_suffix): Avoid use of cp_build_binary_op when
index cea649a..a98d902 100644 (file)
@@ -7470,20 +7470,20 @@ grokdeclarator (const cp_declarator *declarator,
 
   /* Warn about storage classes that are invalid for certain
      kinds of declarations (parameters, typenames, etc.).  */
+  if (thread_p
+      && ((storage_class
+          && storage_class != sc_extern
+          && storage_class != sc_static)
+         || declspecs->specs[(int)ds_typedef]))
+    {
+      error ("multiple storage classes in declaration of %qs", name);
+      thread_p = false;
+    }
   if (declspecs->conflicting_specifiers_p)
     {
       error ("conflicting specifiers in declaration of %qs", name);
       storage_class = sc_none;
     }
-  else if (thread_p
-          && ((storage_class
-               && storage_class != sc_extern
-               && storage_class != sc_static)
-              || declspecs->specs[(int)ds_typedef]))
-    {
-      error ("multiple storage classes in declaration of %qs", name);
-      thread_p = false;
-    }
   else if (decl_context != NORMAL
           && ((storage_class != sc_none
                && storage_class != sc_mutable)
index e699db6..1a46168 100644 (file)
@@ -1,5 +1,8 @@
 2007-02-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/30536
+       * g++.dg/tls/diag-5.C: New test.
+
        PR middle-end/30473
        * gcc.dg/pr30473.c: New test.
        * gcc.c-torture/execute/20070201-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/tls/diag-5.C b/gcc/testsuite/g++.dg/tls/diag-5.C
new file mode 100644 (file)
index 0000000..ca92b30
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/30536
+// Invalid __thread specifiers.
+// { dg-require-effective-target tls }
+
+struct A { __thread register int i; }; // { dg-error "multiple storage classes|storage class specified" }