Commit 27d6592c by Mark Mitchell Committed by Mark Mitchell

re PR c++/19244 (Typedef of anonymous class incorrectly handled in member function definition)

	PR c++/19244
	* class.c (add_implicitly_declared_members): Remove dead code.
	* decl.c (grokfndecl): Add sfk parameter.  Use it do set
	DECL_CONSTRUCTOR_P.
	(grokdeclarator): Adjust calls to grokfndecl.
	* method.c (implicitly_declare_fn): Improve documentation.
	* parser.c (cp_parser_direct_declarator): Do not consider a
	function to be a constructor if the containing class was
	originally anonymous.

        PR c++/19244
	* g++.dg/parser/ctor2.C: New test.

From-SVN: r93004
parent 27916b83
2005-01-06 Mark Mitchell <mark@codesourcery.com>
PR c++/19244
* class.c (add_implicitly_declared_members): Remove dead code.
* decl.c (grokfndecl): Add sfk parameter. Use it do set
DECL_CONSTRUCTOR_P.
(grokdeclarator): Adjust calls to grokfndecl.
* method.c (implicitly_declare_fn): Improve documentation.
* parser.c (cp_parser_direct_declarator): Do not consider a
function to be a constructor if the containing class was
originally anonymous.
2005-01-06 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/17154
......
......@@ -2485,17 +2485,11 @@ add_implicitly_declared_members (tree t,
default_fn = implicitly_declare_fn (sfk_destructor, t, /*const_p=*/0);
check_for_override (default_fn, t);
/* If we couldn't make it work, then pretend we didn't need it. */
if (default_fn == void_type_node)
TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = 0;
else
{
TREE_CHAIN (default_fn) = implicit_fns;
implicit_fns = default_fn;
if (DECL_VINDEX (default_fn))
virtual_dtor = default_fn;
}
TREE_CHAIN (default_fn) = implicit_fns;
implicit_fns = default_fn;
if (DECL_VINDEX (default_fn))
virtual_dtor = default_fn;
}
else
/* Any non-implicit destructor is non-trivial. */
......
......@@ -61,10 +61,6 @@ static int ambi_op_p (enum tree_code);
static int unary_op_p (enum tree_code);
static void push_local_name (tree);
static tree grok_reference_init (tree, tree, tree, tree *);
static tree grokfndecl (tree, tree, tree, tree, tree, int,
enum overload_flags, cp_cv_quals,
tree, int, int, int, int, int, int, tree,
tree *);
static tree grokvardecl (tree, tree, const cp_decl_specifier_seq *,
int, int, tree);
static void record_unknown_type (tree, const char *);
......@@ -5616,6 +5612,8 @@ bad_specifiers (tree object,
CHECK is 1 if we must find this method in CTYPE, 0 if we should
not look, and -1 if we should not call `grokclassfn' at all.
SFK is the kind of special function (if any) for the new function.
Returns `NULL_TREE' if something goes wrong, after issuing
applicable error messages. */
......@@ -5633,6 +5631,7 @@ grokfndecl (tree ctype,
int friendp,
int publicp,
int inlinep,
special_function_kind sfk,
int funcdef_flag,
int template_count,
tree in_namespace,
......@@ -5843,14 +5842,13 @@ grokfndecl (tree ctype,
if (check < 0)
return decl;
if (flags == NO_SPECIAL && ctype && constructor_name_p (declarator, ctype))
DECL_CONSTRUCTOR_P (decl) = 1;
/* Function gets the ugly name, field gets the nice one. This call
may change the type of the function (because of default
parameters)! */
if (ctype != NULL_TREE)
grokclassfn (ctype, decl, flags, quals);
{
if (sfk == sfk_constructor)
DECL_CONSTRUCTOR_P (decl) = 1;
grokclassfn (ctype, decl, flags, quals);
}
decl = check_explicit_specialization (orig_declarator, decl,
template_count,
......@@ -7981,6 +7979,7 @@ grokdeclarator (const cp_declarator *declarator,
unqualified_id,
virtualp, flags, quals, raises,
friendp ? -1 : 0, friendp, publicp, inlinep,
sfk,
funcdef_flag, template_count, in_namespace, attrlist);
if (decl == NULL_TREE)
return decl;
......@@ -8027,8 +8026,9 @@ grokdeclarator (const cp_declarator *declarator,
parms,
unqualified_id,
virtualp, flags, quals, raises,
friendp ? -1 : 0, friendp, 1, 0, funcdef_flag,
template_count, in_namespace, attrlist);
friendp ? -1 : 0, friendp, 1, 0, sfk,
funcdef_flag, template_count, in_namespace,
attrlist);
if (decl == NULL_TREE)
return NULL_TREE;
}
......@@ -8213,7 +8213,7 @@ grokdeclarator (const cp_declarator *declarator,
decl = grokfndecl (ctype, type, original_name, parms, unqualified_id,
virtualp, flags, quals, raises,
1, friendp,
publicp, inlinep, funcdef_flag,
publicp, inlinep, sfk, funcdef_flag,
template_count, in_namespace, attrlist);
if (decl == NULL_TREE)
return NULL_TREE;
......
......@@ -925,7 +925,8 @@ locate_copy (tree type, void *client_)
/* Implicitly declare the special function indicated by KIND, as a
member of TYPE. For copy constructors and assignment operators,
CONST_P indicates whether these functions should take a const
reference argument or a non-const reference. */
reference argument or a non-const reference. Returns the
FUNCTION_DECL for the implicitly declared function. */
tree
implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
......
......@@ -11109,11 +11109,16 @@ cp_parser_direct_declarator (cp_parser* parser,
declarator->u.id.sfk = sfk_destructor;
else if (IDENTIFIER_TYPENAME_P (unqualified_name))
declarator->u.id.sfk = sfk_conversion;
else if (constructor_name_p (unqualified_name,
class_type)
|| (TREE_CODE (unqualified_name) == TYPE_DECL
&& same_type_p (TREE_TYPE (unqualified_name),
class_type)))
else if (/* There's no way to declare a constructor
for an anonymous type, even if the type
got a name for linkage purposes. */
!TYPE_WAS_ANONYMOUS (class_type)
&& (constructor_name_p (unqualified_name,
class_type)
|| (TREE_CODE (unqualified_name) == TYPE_DECL
&& (same_type_p
(TREE_TYPE (unqualified_name),
class_type)))))
declarator->u.id.sfk = sfk_constructor;
if (ctor_dtor_or_conv_p && declarator->u.id.sfk != sfk_none)
......
2005-01-06 Mark Mitchell <mark@codesourcery.com>
PR c++/19244
* g++.dg/parser/ctor2.C: New test.
2004-01-06 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/17154
......
// PR c++/19244
typedef struct { void f(); } f;
void f::f() { }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment