diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-03-10 15:19:51 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-03-10 15:19:51 +0100 |
commit | 004c400a00547ee5ca992b393705f561811590ce (patch) | |
tree | ee6efb893632d420f6f46f056e1ad1ab4f7539d8 /gcc/cp | |
parent | 91c185122e8f323460c5f587d4c28cf57bee34aa (diff) | |
download | gcc-004c400a00547ee5ca992b393705f561811590ce.zip gcc-004c400a00547ee5ca992b393705f561811590ce.tar.gz gcc-004c400a00547ee5ca992b393705f561811590ce.tar.bz2 |
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
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 32 |
2 files changed, 20 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0665b65..5c02ee9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2005-03-10 Jakub Jelinek <jakub@redhat.com> + + 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 <mark@codesourcery.com> PR c++/20208 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c253028..dee5c46 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 (); } } |