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)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 00:42:41 +0000 (09:42 +0900)
* 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/testsuite/ChangeLog

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 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>