From d7d938374664ca711b5bb894486394425d8c9227 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Tue, 6 Dec 2005 19:45:00 +0000 Subject: [PATCH] re PR c++/24138 (ICE with the code in PR 20407) 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. From-SVN: r108126 --- gcc/ChangeLog | 7 +++++++ gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 4 ++++ gcc/testsuite/g++.dg/init/array0.C | 12 ++++++++++++ gcc/tree.c | 6 ++++-- 5 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/array0.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f65ed2307942..ea51aa210628 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 d133d8b144ae..77f506e93bdd 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 b5f89fccb064..ffa5e336d9b2 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 000000000000..235cdf0deb91 --- /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 324e83301f5f..42da6891d8dd 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. */