Commit fb232476 by Mark Mitchell Committed by Mark Mitchell

re PR c++/16623 (g++ ICE in tsubst_decl:6081)

	PR c++/16623
	* cp-tree.h (lang_type_class): Add lazy_assignment_op.
	(CLASSTYPE_LAZY_ASSIGNMENT_OP): New macro.
	* class.c (add_implicitly_declared_members): Use
	CLASSTYPE_LAZY_ASSIGNMENT_OP.
	* method.c (lazily_declare_fn): Clear
	CLASSTYPE_LAZY_ASSIGNMENT_OP.
	* search.c (lookup_fnfields_1): Check it.

From-SVN: r84956
parent bd65c564
2004-07-19 Mark Mitchell <mark@codesourcery.com>
PR c++/16623
* cp-tree.h (lang_type_class): Add lazy_assignment_op.
(CLASSTYPE_LAZY_ASSIGNMENT_OP): New macro.
* class.c (add_implicitly_declared_members): Use
CLASSTYPE_LAZY_ASSIGNMENT_OP.
* method.c (lazily_declare_fn): Clear
CLASSTYPE_LAZY_ASSIGNMENT_OP.
* search.c (lookup_fnfields_1): Check it.
2004-07-20 Nathan Sidwell <nathan@codesourcery.com>
* cp-tree.h (vec_binfo_member): Remove.
......
......@@ -2533,7 +2533,11 @@ add_implicitly_declared_members (tree t,
of the parameter to the assignment operator will be a const or
non-const reference. */
if (!TYPE_HAS_ASSIGN_REF (t) && !TYPE_FOR_JAVA (t))
TYPE_HAS_CONST_ASSIGN_REF (t) = !cant_have_const_assignment;
{
TYPE_HAS_ASSIGN_REF (t) = 1;
TYPE_HAS_CONST_ASSIGN_REF (t) = !cant_have_const_assignment;
CLASSTYPE_LAZY_ASSIGNMENT_OP (t) = 1;
}
/* Now, hook all of the new functions on to TYPE_METHODS,
and add them to the CLASSTYPE_METHOD_VEC. */
......
......@@ -987,6 +987,7 @@ struct lang_type_class GTY(())
unsigned lazy_default_ctor : 1;
unsigned lazy_copy_ctor : 1;
unsigned lazy_assignment_op : 1;
unsigned has_const_init_ref : 1;
unsigned has_complex_init_ref : 1;
unsigned has_complex_assign_ref : 1;
......@@ -1000,7 +1001,7 @@ struct lang_type_class GTY(())
/* There are some bits left to fill out a 32-bit word. Keep track
of this by updating the size of this bitfield whenever you add or
remove a flag. */
unsigned dummy : 9;
unsigned dummy : 8;
tree primary_base;
tree vcall_indices;
......@@ -1094,6 +1095,11 @@ struct lang_type GTY(())
#define CLASSTYPE_LAZY_COPY_CTOR(NODE) \
(LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor)
/* Nonzero means that NODE (a class type) has an assignment operator
-- but that it has not yet been declared. */
#define CLASSTYPE_LAZY_ASSIGNMENT_OP(NODE) \
(LANG_TYPE_CLASS_CHECK (NODE)->lazy_assignment_op)
/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */
#define TYPE_HAS_ASSIGN_REF(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_assign_ref)
......
......@@ -1064,6 +1064,8 @@ lazily_declare_fn (special_function_kind sfk, tree type)
/* Create appropriate clones. */
clone_function_decl (fn, /*update_method_vec=*/true);
}
else if (sfk == sfk_assignment_operator)
CLASSTYPE_LAZY_ASSIGNMENT_OP (type) = 0;
return fn;
}
......
......@@ -1367,8 +1367,7 @@ lookup_fnfields_1 (tree type, tree name)
lazily_declare_fn (sfk_copy_constructor, type);
}
else if (name == ansi_assopname(NOP_EXPR)
&& !TYPE_HAS_ASSIGN_REF (type)
&& !TYPE_FOR_JAVA (type))
&& CLASSTYPE_LAZY_ASSIGNMENT_OP (type))
lazily_declare_fn (sfk_assignment_operator, type);
}
......
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