From: Jakub Jelinek Date: Thu, 10 Mar 2005 14:19:51 +0000 (+0100) Subject: PR c++/18384, c++/18327 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=004c400a00547ee5ca992b393705f561811590ce;p=gcc.git PR c++/18384, c++/18327 PR c++/18384, c++/18327 * decl.c (reshape_init_array): Use UHWI type for max_index_cst and index. Convert max_index to size_type_node if it isn't host_integerp (, 1). * g++.dg/init/array19.C: New test. From-SVN: r96236 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0665b65f2c0..5c02ee9f708 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2005-03-10 Jakub Jelinek + + PR c++/18384, c++/18327 + * decl.c (reshape_init_array): Use UHWI type for max_index_cst + and index. Convert max_index to size_type_node if it isn't + host_integerp (, 1). + 2005-03-09 Mark Mitchell PR c++/20208 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c253028709a..dee5c460165 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4099,13 +4099,18 @@ reshape_init_array (tree elt_type, tree max_index, tree *initp, tree new_init) { bool sized_array_p = (max_index != NULL_TREE); - HOST_WIDE_INT max_index_cst = 0; - HOST_WIDE_INT index; + unsigned HOST_WIDE_INT max_index_cst = 0; + unsigned HOST_WIDE_INT index; if (sized_array_p) - /* HWI is either 32bit or 64bit, so it must be enough to represent the - array size. */ - max_index_cst = tree_low_cst (max_index, 1); + { + if (host_integerp (max_index, 1)) + max_index_cst = tree_low_cst (max_index, 1); + /* sizetype is sign extended, not zero extended. */ + else + max_index_cst = tree_low_cst (fold_convert (size_type_node, max_index), + 1); + } /* Loop until there are no more initializers. */ for (index = 0; @@ -4122,27 +4127,16 @@ reshape_init_array (tree elt_type, tree max_index, CONSTRUCTOR_ELTS (new_init) = element_init; designated_index = TREE_PURPOSE (element_init); if (designated_index) - { + { /* Handle array designated initializers (GNU extension). */ if (TREE_CODE (designated_index) == IDENTIFIER_NODE) { error ("name %qD used in a GNU-style designated " - "initializer for an array", designated_index); + "initializer for an array", designated_index); TREE_PURPOSE (element_init) = NULL_TREE; } else - { - gcc_assert (TREE_CODE (designated_index) == INTEGER_CST); - if (sized_array_p - && tree_int_cst_lt (max_index, designated_index)) - { - error ("Designated initializer %qE larger than array " - "size", designated_index); - TREE_PURPOSE (element_init) = NULL_TREE; - } - else - index = tree_low_cst (designated_index, 1); - } + gcc_unreachable (); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 53daac00c96..be5388f72a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2005-03-10 Jakub Jelinek + PR c++/18384, c++/18327 + * g++.dg/init/array19.C: New test. + PR inline-asm/20314 * gcc.dg/torture/pr20314-1.c: New test. * gcc.dg/torture/pr20314-2.c: New test. diff --git a/gcc/testsuite/g++.dg/init/array19.C b/gcc/testsuite/g++.dg/init/array19.C new file mode 100644 index 00000000000..a5f124e21ce --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array19.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "" } +double a[0] = { }; +const double b[0][1] = { };