re PR c++/22293 (ICE declaring destructor as friend)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Tue, 18 Oct 2005 16:20:55 +0000 (16:20 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Tue, 18 Oct 2005 16:20:55 +0000 (16:20 +0000)
PR c++/22293
* decl.c (grokdeclarator): Reject unqualified destructors in
friend declarations.

* g++.dg/other/friend3.C: New test.

From-SVN: r105564

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/friend3.C [new file with mode: 0644]

index 4c79e894de7052dbbb380297f7d4bede6dbd4ae8..e7c259da63cc9a9bbfa870d3abe70e284b967e12 100644 (file)
@@ -1,3 +1,9 @@
+2005-10-18  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/22293
+       * decl.c (grokdeclarator): Reject unqualified destructors in
+       friend declarations.
+
 2005-10-18  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/23293
index 982fe121805aa23f20840fd9c12ad73fb49022b4..89588502ca5f8eac08944606c80f0c67fb5fb08e 100644 (file)
@@ -8021,15 +8021,25 @@ grokdeclarator (const cp_declarator *declarator,
              }
 
            /* Check that the name used for a destructor makes sense.  */
-           if (sfk == sfk_destructor
-               && !same_type_p (TREE_OPERAND
-                                (id_declarator->u.id.unqualified_name, 0),
-                                ctype))
+           if (sfk == sfk_destructor)
              {
-               error ("declaration of %qD as member of %qT",
-                      id_declarator->u.id.unqualified_name,
-                      ctype);
-               return error_mark_node;
+               if (!ctype)
+                 {
+                   gcc_assert (friendp);
+                   error ("expected qualified name in friend declaration "
+                          "for destructor %qD",
+                          id_declarator->u.id.unqualified_name);
+                   return error_mark_node;
+                 }
+
+               if (!same_type_p (TREE_OPERAND
+                                 (id_declarator->u.id.unqualified_name, 0),
+                                 ctype))
+                 {
+                   error ("declaration of %qD as member of %qT",
+                          id_declarator->u.id.unqualified_name, ctype);
+                   return error_mark_node;
+                 }
              }
 
            /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node.  */
index f2123589f84f7b5b3a75c8e1b59e4c578d3ca832..6ba90568ccd76a146d674773801f51f44c8ce635 100644 (file)
@@ -1,3 +1,8 @@
+2005-10-18  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/22293
+       * g++.dg/other/friend3.C: New test.
+
 2005-10-18  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/23293
diff --git a/gcc/testsuite/g++.dg/other/friend3.C b/gcc/testsuite/g++.dg/other/friend3.C
new file mode 100644 (file)
index 0000000..ce872e5
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/22293
+// Origin: Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+struct A
+{
+  friend ~A();  // { dg-error "qualified name" }
+};
+
+struct B
+{
+  friend ~A();  // { dg-error "qualified name" }
+};