... oh well, I just realized that zero-size VECTORs don't make much sense and are early rejected, thus I can improve my earlier patch.

Now I'm happier: essentially I'm only *moving* code around ;)

Thanks,
Paolo.

//////////////////////
/cp
2012-10-17  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/54501
        * decl.c (reshape_init_array): Check for zero-size arrays.
        (reshape_init_array_1): Don't handle zero-size arrays here.

/testsuite
2012-10-17  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/54501
        * g++.dg/init/array30.C: New.
        * g++.dg/init/array0.C: Adjust.
        * g++.dg/parse/pr43765.C: Likewise.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 192527)
+++ cp/decl.c   (working copy)
@@ -5022,10 +5022,6 @@ reshape_init_array_1 (tree elt_type, tree max_inde
 
   if (sized_array_p)
     {
-      /* Minus 1 is used for zero sized arrays.  */
-      if (integer_all_onesp (max_index))
-       return new_init;
-
       if (host_integerp (max_index, 1))
        max_index_cst = tree_low_cst (max_index, 1);
       /* sizetype is sign extended, not zero extended.  */
@@ -5068,6 +5064,14 @@ reshape_init_array (tree type, reshape_iter *d, ts
   if (TYPE_DOMAIN (type))
     max_index = array_type_nelts (type);
 
+  /* Minus 1 is used for zero sized arrays.  */
+  if (max_index && integer_all_onesp (max_index))
+    {
+      if (complain & tf_error)
+       error ("initializers provided for zero-size array of type %qT", type);
+      return error_mark_node;
+    }
+
   return reshape_init_array_1 (TREE_TYPE (type), max_index, d, complain);
 }
 
Index: testsuite/g++.dg/parse/pr43765.C
===================================================================
--- testsuite/g++.dg/parse/pr43765.C    (revision 192527)
+++ testsuite/g++.dg/parse/pr43765.C    (working copy)
@@ -11,4 +11,4 @@ SomeType vals[] =
     {
         { values : temp, },
         0
-    };          // { dg-error "invalid" }
+    };          // { dg-error "zero-size" }
Index: testsuite/g++.dg/init/array30.C
===================================================================
--- testsuite/g++.dg/init/array30.C     (revision 0)
+++ testsuite/g++.dg/init/array30.C     (working copy)
@@ -0,0 +1,7 @@
+// PR c++/54501
+// { dg-options "" }
+
+int main()
+{
+  int a[][0] = {0};  // { dg-error "zero-size" }
+}
Index: testsuite/g++.dg/init/array0.C
===================================================================
--- testsuite/g++.dg/init/array0.C      (revision 192527)
+++ testsuite/g++.dg/init/array0.C      (working copy)
@@ -8,5 +8,5 @@ void foo()
     unsigned char dir;
     int data[0];
   } yanito;
-  static const yanito horse = { 1,  { 2,  3 }  }; // { dg-error "too many" }
+  static const yanito horse = { 1,  { 2,  3 }  }; // { dg-error "zero-size" }
 }

Reply via email to