* 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
+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
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) ?
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.
--- /dev/null
+// 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" }
+};