Commit d4b5fb22 by Jason Merrill Committed by Jason Merrill

decl.c (next_initializable_field): No longer static.

	* decl.c (next_initializable_field): No longer static.
	* cp-tree.h: Declare it.
	* call.c (build_aggr_conv): Fail if there are more initializers
	than initializable fields.

From-SVN: r157927
parent 9542943d
2010-04-01 Jason Merrill <jason@redhat.com> 2010-04-01 Jason Merrill <jason@redhat.com>
* decl.c (next_initializable_field): No longer static.
* cp-tree.h: Declare it.
* call.c (build_aggr_conv): Fail if there are more initializers
than initializable fields.
* semantics.c (maybe_add_lambda_conv_op): Use null_pointer_node * semantics.c (maybe_add_lambda_conv_op): Use null_pointer_node
instead of void_zero_node. instead of void_zero_node.
......
...@@ -626,23 +626,27 @@ build_aggr_conv (tree type, tree ctor, int flags) ...@@ -626,23 +626,27 @@ build_aggr_conv (tree type, tree ctor, int flags)
{ {
unsigned HOST_WIDE_INT i = 0; unsigned HOST_WIDE_INT i = 0;
conversion *c; conversion *c;
tree field = TYPE_FIELDS (type); tree field = next_initializable_field (TYPE_FIELDS (type));
for (; field; field = TREE_CHAIN (field), ++i) for (; field; field = next_initializable_field (TREE_CHAIN (field)))
{ {
if (TREE_CODE (field) != FIELD_DECL)
continue;
if (i < CONSTRUCTOR_NELTS (ctor)) if (i < CONSTRUCTOR_NELTS (ctor))
{ {
constructor_elt *ce = CONSTRUCTOR_ELT (ctor, i); constructor_elt *ce = CONSTRUCTOR_ELT (ctor, i);
if (!can_convert_arg (TREE_TYPE (field), TREE_TYPE (ce->value), if (!can_convert_arg (TREE_TYPE (field), TREE_TYPE (ce->value),
ce->value, flags)) ce->value, flags))
return NULL; return NULL;
++i;
if (TREE_CODE (type) == UNION_TYPE)
break;
} }
else if (build_value_init (TREE_TYPE (field)) == error_mark_node) else if (build_value_init (TREE_TYPE (field)) == error_mark_node)
return NULL; return NULL;
} }
if (i < CONSTRUCTOR_NELTS (ctor))
return NULL;
c = alloc_conversion (ck_aggr); c = alloc_conversion (ck_aggr);
c->type = type; c->type = type;
c->rank = cr_exact; c->rank = cr_exact;
......
...@@ -4727,6 +4727,7 @@ extern bool cp_missing_noreturn_ok_p (tree); ...@@ -4727,6 +4727,7 @@ extern bool cp_missing_noreturn_ok_p (tree);
extern void initialize_artificial_var (tree, tree); extern void initialize_artificial_var (tree, tree);
extern tree check_var_type (tree, tree); extern tree check_var_type (tree, tree);
extern tree reshape_init (tree, tree); extern tree reshape_init (tree, tree);
extern tree next_initializable_field (tree);
extern bool defer_mark_used_calls; extern bool defer_mark_used_calls;
extern GTY(()) VEC(tree, gc) *deferred_mark_used_calls; extern GTY(()) VEC(tree, gc) *deferred_mark_used_calls;
......
...@@ -104,7 +104,6 @@ static tree build_cp_library_fn (tree, enum tree_code, tree); ...@@ -104,7 +104,6 @@ static tree build_cp_library_fn (tree, enum tree_code, tree);
static void store_parm_decls (tree); static void store_parm_decls (tree);
static void initialize_local_var (tree, tree); static void initialize_local_var (tree, tree);
static void expand_static_init (tree, tree); static void expand_static_init (tree, tree);
static tree next_initializable_field (tree);
/* The following symbols are subsumed in the cp_global_trees array, and /* The following symbols are subsumed in the cp_global_trees array, and
listed here individually for documentation purposes. listed here individually for documentation purposes.
...@@ -4723,7 +4722,7 @@ static tree reshape_init_r (tree, reshape_iter *, bool); ...@@ -4723,7 +4722,7 @@ static tree reshape_init_r (tree, reshape_iter *, bool);
initialized. If there are no more such fields, the return value initialized. If there are no more such fields, the return value
will be NULL. */ will be NULL. */
static tree tree
next_initializable_field (tree field) next_initializable_field (tree field)
{ {
while (field while (field
......
2010-04-01 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/initlist12.C: Adjust expected errors.
2010-04-01 Janne Blomqvist <jb@gcc.gnu.org> 2010-04-01 Janne Blomqvist <jb@gcc.gnu.org>
Manfred Schwarb <manfred99@gmx.ch> Manfred Schwarb <manfred99@gmx.ch>
......
// PR c++/38698 // PR c++/38698
// { dg-options "-std=c++0x" } // { dg-options "-std=c++0x" }
// { dg-prune-output "note" }
struct A struct A
{ {
int i; int i;
}; };
A a({1,2}); // { dg-error "too many initializers" } A a({1,2}); // { dg-error "no match" }
union U union U
{ {
int i,j; int i,j;
}; };
U u({1,2}); // { dg-error "too many initializers" } U u({1,2}); // { dg-error "no match" }
union V {}; union V {};
V v({1}); // { dg-error "too many initializers" } V v({1}); // { dg-error "no match" }
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