OSDN Git Service

PR C++/24138
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Dec 2005 19:45:00 +0000 (19:45 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Dec 2005 19:45:00 +0000 (19:45 +0000)
        * tree.c (integer_all_onesp): Always return true if all bits on.

        * cp/decl.c (reshape_init_array_1): Handle max_index of -1.

        * testsuite/g++.dg/init/array0.C: New.

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

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/init/array0.C [new file with mode: 0644]
gcc/tree.c

index f65ed23..ea51aa2 100644 (file)
@@ -1,3 +1,10 @@
+2005-12-06  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR C++/24138
+        * tree.c (integer_all_onesp): Always return true if all bits on.
+
+        * testsuite/g++.dg/init/array0.C: New.
+
 2005-12-06  Adrian Straetling  <straetling@de.ibm.com>
 
          * doc/md.texi: Adapt to implementation.
index d133d8b..77f506e 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-06  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR C++/24138
+        * decl.c (reshape_init_array_1): Handle max_index of -1.
+
 2005-12-06  Roger Sayle  <roger@eyesopen.com>
 
        * typeck.c (build_binary_op): Issue warning if either operand of a
index b5f89fc..ffa5e33 100644 (file)
@@ -4209,6 +4209,10 @@ reshape_init_array_1 (tree elt_type, tree max_index, reshape_iter *d)
 
   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.  */
diff --git a/gcc/testsuite/g++.dg/init/array0.C b/gcc/testsuite/g++.dg/init/array0.C
new file mode 100644 (file)
index 0000000..235cdf0
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "" }
+// PR C++/24138
+
+void foo()
+{
+  typedef struct {
+    unsigned char dir;
+    int data[0];
+  } yanito;
+  static const yanito horse = { 1,  { 2,  3 }  }; // { dg-error "too many" }
+}
index 324e833..42da689 100644 (file)
@@ -1208,9 +1208,11 @@ integer_all_onesp (tree expr)
     return 0;
 
   uns = TYPE_UNSIGNED (TREE_TYPE (expr));
+  if (TREE_INT_CST_LOW (expr) == ~(unsigned HOST_WIDE_INT) 0
+      && TREE_INT_CST_HIGH (expr) == -1)
+    return 1;
   if (!uns)
-    return (TREE_INT_CST_LOW (expr) == ~(unsigned HOST_WIDE_INT) 0
-           && TREE_INT_CST_HIGH (expr) == -1);
+    return 0;
 
   /* Note that using TYPE_PRECISION here is wrong.  We care about the
      actual bits, not the (arbitrary) range of the type.  */