re PR c++/27270 (ICE in process_init_constructor_array, at cp/typeck2.c:788)
authorMark Mitchell <mark@codesourcery.com>
Tue, 17 Oct 2006 22:25:35 +0000 (22:25 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 17 Oct 2006 22:25:35 +0000 (22:25 +0000)
PR c++/27270
* decl.c (reshape_init_class): Move check for designated
to ...
* parser.c (cp_parser_initializer_list): ... here.
* pt.c (tsubst_copy_and_build): Use finish_compound_literal.
PR c++/27270
* g++.dg/ext/complit8.C: Tweak error markers.
* g++.dg/template/complit1.C: Add error marker.

From-SVN: r117832

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/complit8.C
gcc/testsuite/g++.dg/template/complit1.C

index e603fd5e4749bdf91ead735808c90315109c26e5..47285866dc6608cfe7d42e3cd0e3e6abc7a35be3 100644 (file)
@@ -1,3 +1,11 @@
+2006-10-17  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/27270
+       * decl.c (reshape_init_class): Move check for designated
+       to ...
+       * parser.c (cp_parser_initializer_list): ... here.
+       * pt.c (tsubst_copy_and_build): Use finish_compound_literal.
+
 2006-10-16  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/27270
index e814c0a4eb87680ab1ae12c385004b2698f22802..11bb6486456c04d47b6be0eedaab3bf9a958766e 100644 (file)
@@ -4485,9 +4485,6 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p)
       /* Handle designated initializers, as an extension.  */
       if (d->cur->index)
        {
-         if (pedantic)
-           pedwarn ("ISO C++ does not allow designated initializers");
-
          field = lookup_field_1 (type, d->cur->index, /*want_type=*/false);
 
          if (!field || TREE_CODE (field) != FIELD_DECL)
index 1ffc9ee887792b79d512d03b3ee27e62c5d4187e..dfcbe733316e8413821845b4e6f2b0ef339ce5da 100644 (file)
@@ -12736,6 +12736,9 @@ cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
          && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
          && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
        {
+         /* Warn the user that they are using an extension.  */
+         if (pedantic)
+           pedwarn ("ISO C++ does not allow designated initializers");
          /* Consume the identifier.  */
          identifier = cp_lexer_consume_token (parser->lexer)->value;
          /* Consume the `:'.  */
index ce5a80915f98cc20c7727dfff9595465e700ee0b..9a4626415c85f75b4ed57d90777831562a96c7df 100644 (file)
@@ -9323,7 +9323,6 @@ tsubst_copy_and_build (tree t,
        VEC(constructor_elt,gc) *n;
        constructor_elt *ce;
        unsigned HOST_WIDE_INT idx;
-       tree r;
        tree type = tsubst (TREE_TYPE (t), args, complain, in_decl);
        bool process_index_p;
 
@@ -9347,15 +9346,10 @@ tsubst_copy_and_build (tree t,
            ce->value = RECUR (ce->value);
          }
 
-       r = build_constructor (NULL_TREE, n);
-       TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
+       if (TREE_HAS_CONSTRUCTOR (t))
+         return finish_compound_literal (type, n);
 
-       if (type)
-         {
-           r = reshape_init (type, r);
-           return digest_init (type, r);
-         }
-       return r;
+       return build_constructor (NULL_TREE, n);
       }
 
     case TYPEID_EXPR:
index 603cbedee8a792cbdf035f6eb502a32e10bb251d..4fed928d1caddcdee2befeaf65d20953d9e718f4 100644 (file)
@@ -1,3 +1,9 @@
+2006-10-17  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/27270
+       * g++.dg/ext/complit8.C: Tweak error markers.
+       * g++.dg/template/complit1.C: Add error marker.
+
 2006-10-16  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/27270
index b778b4b92b637b1e7ae9574c5ccc20ee4e8cad5c..97ff563feec16a17c1c892f42e5f2f702a06bcec 100644 (file)
@@ -5,7 +5,7 @@ template<typename Entry>
 struct Array {
   Entry *array[32];
   Array () :
-    array ( (Entry*[1]) { 0, 0 } ) // { dg-error "initializers|conversion" }
+    array ( (Entry*[1]) { 0, 0 } ) // { dg-error "initializers|incompatible" }
   {}
 };
 
index 00eb23e83b3e29a9da7c4fe4f61237e67aeacdd4..218a7c92908306d1570d39cdd8a935bed31a55bf 100644 (file)
@@ -6,6 +6,6 @@ template <int D> struct C {
 };
 
 template<int D>
-C<D>::C() : d((int[]){1,2,3}) {}
+C<D>::C() : d((int[]){1,2,3}) {} // { dg-error "array" }
 
 template class C<1>;