re PR c++/21495 (internal compiler error: Segmentation fault)
authorJakub Jelinek <jakub@redhat.com>
Thu, 19 May 2005 07:37:45 +0000 (09:37 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 19 May 2005 07:37:45 +0000 (09:37 +0200)
PR c++/21495
* decl.c (grokdeclarator): Fix "storage class specified for"
error reporting.

* g++.dg/parse/extern1.C: New test.
* g++.dg/tls/diag-2.C: Adjust expected error message wording.

From-SVN: r99960

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

index 1cc6dc08c4d3d581d6e7a9eee001c03db85325a6..0fd719d9e778007baf315df69a7594bb29032317 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/21495
+       * decl.c (grokdeclarator): Fix "storage class specified for"
+       error reporting.
+
 2005-05-19  Kazu Hirata  <kazu@cs.umass.edu>
 
        * parser.c: Fix comment typos.
index 529cfd51b009f9e83419e05db39fd9ad1797deee..eb8db9121c8c86362a826b7b64782ad8d19e4b9d 100644 (file)
@@ -7002,30 +7002,7 @@ grokdeclarator (const cp_declarator *declarator,
       else
        {
          if (decl_context == FIELD)
-           {
-             tree tmp = NULL_TREE;
-             int op = 0;
-
-             if (declarator)
-               {
-                 /* Avoid trying to get an operand off an identifier node.  */
-                 if (declarator->kind != cdk_id)
-                   tmp = declarator->declarator->u.id.unqualified_name;
-                 else
-                   tmp = declarator->u.id.unqualified_name;
-                 op = IDENTIFIER_OPNAME_P (tmp);
-                 if (IDENTIFIER_TYPENAME_P (tmp))
-                   {
-                     if (is_typename_at_global_scope (tmp))
-                       name = IDENTIFIER_POINTER (tmp);
-                     else
-                       name = "<invalid operator>";
-                   }
-               }
-             error ("storage class specified for %s %qs",
-                    op ? "member operator" : "field",
-                    name);
-           }
+           error ("storage class specified for %qs", name);
          else
            {
              if (decl_context == PARM || decl_context == CATCHPARM)
index 6f9116146edb6fe022ba5c4267fe1cd7a30126b6..19435c3d7cfe3fb2ee9e2dea4b41b2dab9fab204 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/21495
+       * g++.dg/parse/extern1.C: New test.
+       * g++.dg/tls/diag-2.C: Adjust expected error message wording.
+
 2005-05-19  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gcc.dg/c99-math.h: New.
diff --git a/gcc/testsuite/g++.dg/parse/extern1.C b/gcc/testsuite/g++.dg/parse/extern1.C
new file mode 100644 (file)
index 0000000..cc95fa6
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/21495
+// { dg-do compile }
+
+class A
+{
+  extern void *copy (void) // { dg-error "storage class specified" }
+  {
+    return 0;
+  }
+  extern A &operator= (const A &) // { dg-error "storage class specified" }
+  {
+    return *this;
+  }
+};
index 6cd539d6fbe1d15b2129bb0ba46b20037c9caf03..293409db9ce5003b26970b35e86044317032c8bd 100644 (file)
@@ -21,5 +21,5 @@ __thread void f4 () { }               /* { dg-error "invalid for function" } */
 void bar(__thread int p1);     /* { dg-error "(invalid in parameter)|(specified for parameter)" } */
 
 struct A {
-  __thread int i;              /* { dg-error "specified for field" } */
+  __thread int i;              /* { dg-error "storage class specified" } */
 };