OSDN Git Service

* decl.c (next_initializable_field): No longer static.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 1 Apr 2010 18:48:46 +0000 (18:48 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 1 Apr 2010 18:48:46 +0000 (18:48 +0000)
* cp-tree.h: Declare it.
* call.c (build_aggr_conv): Fail if there are more initializers
than initializable fields.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157927 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist12.C

index d8ba37d..ee75c46 100644 (file)
@@ -1,5 +1,10 @@
 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
        instead of void_zero_node.
 
index edec6ea..5a32b3b 100644 (file)
@@ -626,23 +626,27 @@ build_aggr_conv (tree type, tree ctor, int flags)
 {
   unsigned HOST_WIDE_INT i = 0;
   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))
        {
          constructor_elt *ce = CONSTRUCTOR_ELT (ctor, i);
          if (!can_convert_arg (TREE_TYPE (field), TREE_TYPE (ce->value),
                                ce->value, flags))
            return NULL;
+         ++i;
+         if (TREE_CODE (type) == UNION_TYPE)
+           break;
        }
       else if (build_value_init (TREE_TYPE (field)) == error_mark_node)
        return NULL;
     }
 
+  if (i < CONSTRUCTOR_NELTS (ctor))
+    return NULL;
+
   c = alloc_conversion (ck_aggr);
   c->type = type;
   c->rank = cr_exact;
index fb67965..6334673 100644 (file)
@@ -4727,6 +4727,7 @@ extern bool cp_missing_noreturn_ok_p              (tree);
 extern void initialize_artificial_var          (tree, tree);
 extern tree check_var_type                     (tree, tree);
 extern tree reshape_init (tree, tree);
+extern tree next_initializable_field (tree);
 
 extern bool defer_mark_used_calls;
 extern GTY(()) VEC(tree, gc) *deferred_mark_used_calls;
index e38abda..a308d64 100644 (file)
@@ -104,7 +104,6 @@ static tree build_cp_library_fn (tree, enum tree_code, tree);
 static void store_parm_decls (tree);
 static void initialize_local_var (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
    listed here individually for documentation purposes.
@@ -4723,7 +4722,7 @@ static tree reshape_init_r (tree, reshape_iter *, bool);
    initialized.  If there are no more such fields, the return value
    will be NULL.  */
 
-static tree
+tree
 next_initializable_field (tree field)
 {
   while (field
index 8c48a0b..9eef0b0 100644 (file)
@@ -1,3 +1,7 @@
+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>
            Manfred Schwarb  <manfred99@gmx.ch>
 
index 31d34c4..f344c78 100644 (file)
@@ -1,20 +1,21 @@
 // PR c++/38698
 // { dg-options "-std=c++0x" }
+// { dg-prune-output "note" }
 
 struct A
 {
   int i;
 };
 
-A a({1,2});                    // { dg-error "too many initializers" }
+A a({1,2});                    // { dg-error "no match" }
 
 union U
 {
   int i,j;
 };
 
-U u({1,2});                    // { dg-error "too many initializers" }
+U u({1,2});                    // { dg-error "no match" }
 
 union V {};
 
-V v({1});                      // { dg-error "too many initializers" }
+V v({1});                      // { dg-error "no match" }