From: aldyh Date: Tue, 6 Dec 2005 19:45:00 +0000 (+0000) Subject: PR C++/24138 X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=0c3502bc4f2086700bf2cb24aa4fa8aabaa76c36;p=pf3gnuchains%2Fgcc-fork.git PR C++/24138 * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f65ed230794..ea51aa21062 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-12-06 Aldy Hernandez + + 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 * doc/md.texi: Adapt to implementation. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d133d8b144a..77f506e93bd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2005-12-06 Aldy Hernandez + + PR C++/24138 + * decl.c (reshape_init_array_1): Handle max_index of -1. + 2005-12-06 Roger Sayle * typeck.c (build_binary_op): Issue warning if either operand of a diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b5f89fccb06..ffa5e336d9b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 index 00000000000..235cdf0deb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array0.C @@ -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" } +} diff --git a/gcc/tree.c b/gcc/tree.c index 324e83301f5..42da6891d8d 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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. */