summaryrefslogtreecommitdiff
path: root/gcc/cp/class.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-15 20:45:35 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2010-07-15 20:45:35 +0000
commitc1e4c34a522d131403e31e8786f4a11c40d637d9 (patch)
treed24edade7e9292821567ee6d7750184f5d39c55d /gcc/cp/class.c
parent310dbd55edb088daeb0290e729ad9320ec9dfbcd (diff)
downloadgcc-c1e4c34a522d131403e31e8786f4a11c40d637d9.tar.gz
PR c++/44909
* call.c (add_function_candidate): If we're working on an implicit declaration, don't consider candidates that won't match. * typeck.c (same_type_ignoring_top_level_qualifiers_p): Now a fn. * cp-tree.h (same_type_ignoring_top_level_qualifiers_p): Adjust. Revert: * cp-tree.h (struct lang_type_class): Add has_user_opeq. (TYPE_HAS_USER_OPEQ): New. * decl.c (grok_special_member_properties): Set it. * class.c (add_implicitly_declared_members): Don't lazily declare constructors/operator= if a base or member has a user-declared one. (check_bases_and_members, check_bases): Adjust. (check_field_decls, check_field_decl): Adjust. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162233 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r--gcc/cp/class.c73
1 files changed, 13 insertions, 60 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 79b5a26d775..73bcb7598ee 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -130,7 +130,7 @@ static void finish_struct_methods (tree);
static void maybe_warn_about_overly_private_class (tree);
static int method_name_cmp (const void *, const void *);
static int resort_method_name_cmp (const void *, const void *);
-static void add_implicitly_declared_members (tree, int, int, int, int);
+static void add_implicitly_declared_members (tree, int, int);
static tree fixed_type_or_null (tree, int *, int *);
static tree build_simple_base_path (tree expr, tree binfo);
static tree build_vtbl_ref_1 (tree, tree);
@@ -139,13 +139,13 @@ static void build_vtbl_initializer (tree, tree, tree, tree, int *,
static int count_fields (tree);
static int add_fields_to_record_type (tree, struct sorted_fields_type*, int);
static bool check_bitfield_decl (tree);
-static void check_field_decl (tree, tree, int *, int *, int *, int *, int *);
-static void check_field_decls (tree, tree *, int *, int *, int *, int *);
+static void check_field_decl (tree, tree, int *, int *, int *);
+static void check_field_decls (tree, tree *, int *, int *);
static tree *build_base_field (record_layout_info, tree, splay_tree, tree *);
static void build_base_fields (record_layout_info, splay_tree, tree *);
static void check_methods (tree);
static void remove_zero_width_bit_fields (tree);
-static void check_bases (tree, int *, int *, int *, int *);
+static void check_bases (tree, int *, int *);
static void check_bases_and_members (tree);
static tree create_vtable_ptr (tree, tree *);
static void include_empty_classes (record_layout_info);
@@ -1249,9 +1249,7 @@ handle_using_decl (tree using_decl, tree t)
static void
check_bases (tree t,
int* cant_have_const_ctor_p,
- int* no_const_asn_ref_p,
- int* cant_have_lazy_ctor,
- int* cant_have_lazy_opeq)
+ int* no_const_asn_ref_p)
{
int i;
int seen_non_virtual_nearly_empty_base_p;
@@ -1290,10 +1288,6 @@ check_bases (tree t,
if (TYPE_HAS_COPY_ASSIGN (basetype)
&& !TYPE_HAS_CONST_COPY_ASSIGN (basetype))
*no_const_asn_ref_p = 1;
- if (TYPE_HAS_USER_CONSTRUCTOR (basetype))
- *cant_have_lazy_ctor = 1;
- if (TYPE_HAS_USER_OPEQ (basetype))
- *cant_have_lazy_opeq = 1;
if (BINFO_VIRTUAL_P (base_binfo))
/* A virtual base does not effect nearly emptiness. */
@@ -2634,9 +2628,7 @@ maybe_add_class_template_decl_list (tree type, tree t, int friend_p)
static void
add_implicitly_declared_members (tree t,
int cant_have_const_cctor,
- int cant_have_const_assignment,
- int cant_have_lazy_ctor,
- int cant_have_lazy_opeq)
+ int cant_have_const_assignment)
{
/* Destructor. */
if (!CLASSTYPE_DESTRUCTORS (t))
@@ -2690,26 +2682,6 @@ add_implicitly_declared_members (tree t,
CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 1;
}
- /* If a base or member type has a user-declared constructor or operator=,
- we need to declare ours now to avoid issues with circular lazy
- declarations (cpp0x/implicit6.C). */
- if (cant_have_lazy_ctor)
- {
- if (CLASSTYPE_LAZY_DEFAULT_CTOR (t))
- lazily_declare_fn (sfk_constructor, t);
- if (CLASSTYPE_LAZY_COPY_CTOR (t))
- lazily_declare_fn (sfk_copy_constructor, t);
- if (CLASSTYPE_LAZY_MOVE_CTOR (t))
- lazily_declare_fn (sfk_move_constructor, t);
- }
- if (cant_have_lazy_opeq)
- {
- if (CLASSTYPE_LAZY_COPY_ASSIGN (t))
- lazily_declare_fn (sfk_copy_assignment, t);
- if (CLASSTYPE_LAZY_MOVE_ASSIGN (t))
- lazily_declare_fn (sfk_move_assignment, t);
- }
-
/* We can't be lazy about declaring functions that might override
a virtual function from a base class. */
if (TYPE_POLYMORPHIC_P (t)
@@ -2858,9 +2830,7 @@ check_field_decl (tree field,
tree t,
int* cant_have_const_ctor,
int* no_const_asn_ref,
- int* any_default_members,
- int* cant_have_lazy_ctor,
- int* cant_have_lazy_opeq)
+ int* any_default_members)
{
tree type = strip_array_types (TREE_TYPE (field));
@@ -2877,8 +2847,7 @@ check_field_decl (tree field,
for (fields = TYPE_FIELDS (type); fields; fields = DECL_CHAIN (fields))
if (TREE_CODE (fields) == FIELD_DECL && !DECL_C_BIT_FIELD (field))
check_field_decl (fields, t, cant_have_const_ctor,
- no_const_asn_ref, any_default_members,
- cant_have_lazy_ctor, cant_have_lazy_opeq);
+ no_const_asn_ref, any_default_members);
}
/* Check members with class type for constructors, destructors,
etc. */
@@ -2930,11 +2899,6 @@ check_field_decl (tree field,
if (TYPE_HAS_COPY_ASSIGN (type)
&& !TYPE_HAS_CONST_COPY_ASSIGN (type))
*no_const_asn_ref = 1;
-
- if (TYPE_HAS_USER_CONSTRUCTOR (type))
- *cant_have_lazy_ctor = 1;
- if (TYPE_HAS_USER_OPEQ (type))
- *cant_have_lazy_opeq = 1;
}
if (DECL_INITIAL (field) != NULL_TREE)
{
@@ -2974,9 +2938,7 @@ check_field_decl (tree field,
static void
check_field_decls (tree t, tree *access_decls,
int *cant_have_const_ctor_p,
- int *no_const_asn_ref_p,
- int *cant_have_lazy_ctor_p,
- int *cant_have_lazy_opeq_p)
+ int *no_const_asn_ref_p)
{
tree *field;
tree *next;
@@ -3168,9 +3130,7 @@ check_field_decls (tree t, tree *access_decls,
check_field_decl (x, t,
cant_have_const_ctor_p,
no_const_asn_ref_p,
- &any_default_members,
- cant_have_lazy_ctor_p,
- cant_have_lazy_opeq_p);
+ &any_default_members);
/* If any field is const, the structure type is pseudo-const. */
if (CP_TYPE_CONST_P (type))
@@ -4493,8 +4453,6 @@ check_bases_and_members (tree t)
/* Nonzero if the implicitly generated assignment operator
should take a non-const reference argument. */
int no_const_asn_ref;
- int cant_have_lazy_ctor = 0;
- int cant_have_lazy_opeq = 0;
tree access_decls;
bool saved_complex_asn_ref;
bool saved_nontrivial_dtor;
@@ -4507,8 +4465,7 @@ check_bases_and_members (tree t)
/* Check all the base-classes. */
check_bases (t, &cant_have_const_ctor,
- &no_const_asn_ref, &cant_have_lazy_ctor,
- &cant_have_lazy_opeq);
+ &no_const_asn_ref);
/* Check all the method declarations. */
check_methods (t);
@@ -4525,9 +4482,7 @@ check_bases_and_members (tree t)
being set appropriately. */
check_field_decls (t, &access_decls,
&cant_have_const_ctor,
- &no_const_asn_ref,
- &cant_have_lazy_ctor,
- &cant_have_lazy_opeq);
+ &no_const_asn_ref);
/* A nearly-empty class has to be vptr-containing; a nearly empty
class contains just a vptr. */
@@ -4599,9 +4554,7 @@ check_bases_and_members (tree t)
/* Synthesize any needed methods. */
add_implicitly_declared_members (t,
cant_have_const_ctor,
- no_const_asn_ref,
- cant_have_lazy_ctor,
- cant_have_lazy_opeq);
+ no_const_asn_ref);
/* Check defaulted declarations here so we have cant_have_const_ctor
and don't need to worry about clones. */