OSDN Git Service

PR c++/34488
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Dec 2007 00:15:32 +0000 (00:15 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Dec 2007 00:15:32 +0000 (00:15 +0000)
* decl.c (grokdeclarator): Reject friend sfk_constructor
FUNCTION_TYPE.

* g++.dg/parse/friend7.C: New test.

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

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

index e4c2244..91d8cea 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/34488
+       * decl.c (grokdeclarator): Reject friend sfk_constructor
+       FUNCTION_TYPE.
+
 2007-12-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/34506
index 6cbf1f1..f968e88 100644 (file)
@@ -8818,6 +8818,13 @@ grokdeclarator (const cp_declarator *declarator,
                    return error_mark_node;
                  }
              }
+           else if (sfk == sfk_constructor && friendp)
+             {
+               error ("expected qualified name in friend declaration "
+                      "for constructor %qD",
+                      id_declarator->u.id.unqualified_name);
+               return error_mark_node;
+             }
 
            /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node.  */
            function_context = (ctype != NULL_TREE) ?
index d42c334..e75f2aa 100644 (file)
@@ -1,5 +1,8 @@
 2007-12-18  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/34488
+       * g++.dg/parse/friend7.C: New test.
+
        PR rtl-optimization/34490
        * gcc.c-torture/execute/20071216-1.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/parse/friend7.C b/gcc/testsuite/g++.dg/parse/friend7.C
new file mode 100644 (file)
index 0000000..668fd35
--- /dev/null
@@ -0,0 +1,37 @@
+// PR c++/34488
+// { dg-do compile }
+
+struct A
+{
+  A ();
+  ~A ();
+  A (const A &);
+};
+
+struct B
+{
+  friend A::A ();
+  friend A::~A ();
+  friend A::A (const A &);
+};
+
+struct C
+{
+  friend int C ();             // { dg-error "return type|in friend decl" }
+  friend int ~C ();            // { dg-error "return type|in friend decl" }
+  friend int C (const C &);    // { dg-error "return type|in friend decl" }
+};
+
+struct D
+{
+  friend int D () {}           // { dg-error "return type|in friend decl" }
+  friend int ~D () {}          // { dg-error "return type|in friend decl" }
+  friend int D (const D &) {}  // { dg-error "return type|in friend decl" }
+};
+
+struct E
+{
+  friend A::A () {}            // { dg-error "cannot define member" }
+  friend A::~A () {}           // { dg-error "cannot define member" }
+  friend A::A (const A &) {}   // { dg-error "cannot define member" }
+};