From e6313a7840a9266bb5777cd29b86885b63b3b24f Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 11 Apr 2011 15:47:30 +0000 Subject: [PATCH] stor-layout.c (layout_type): Compute all array index size operations in the original type. 2011-04-11 Richard Guenther * stor-layout.c (layout_type): Compute all array index size operations in the original type. (initialize_sizetypes): Add comment. (set_sizetype): Do not set TREE_TYPE of a TREE_VEC. c-family/ * c-common.c (complete_array_type): Build a range type of proper type. From-SVN: r172261 --- gcc/ChangeLog | 7 +++++++ gcc/c-family/ChangeLog | 5 +++++ gcc/c-family/c-common.c | 4 +++- gcc/stor-layout.c | 17 +++++++++-------- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f0ed08a334a..5363fe3a49d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-04-11 Richard Guenther + + * stor-layout.c (layout_type): Compute all array index size operations + in the original type. + (initialize_sizetypes): Add comment. + (set_sizetype): Do not set TREE_TYPE of a TREE_VEC. + 2011-04-11 Joseph Myers * common.opt (Tbss=, Tdata=, Ttext=): New options. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index af66edaf103..780036e92e7 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2011-04-11 Richard Guenther + + * c-common.c (complete_array_type): Build a range type of + proper type. + 2011-04-08 Nathan Froyd * c-common.c (handle_sentinel_attribute): Don't use TYPE_ARG_TYPES. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 63444b8d129..030e3c6d116 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -8810,7 +8810,9 @@ complete_array_type (tree *ptype, tree initial_value, bool do_default) TYPE_LANG_FLAG_? bits that the front end may have set. */ main_type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type)); TREE_TYPE (main_type) = unqual_elt; - TYPE_DOMAIN (main_type) = build_index_type (maxindex); + TYPE_DOMAIN (main_type) + = build_range_type (TREE_TYPE (maxindex), + build_int_cst (TREE_TYPE (maxindex), 0), maxindex); layout_type (main_type); /* Make sure we have the canonical MAIN_TYPE. */ diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index a225dbfbd8b..ea0d44d64d2 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1996,15 +1996,16 @@ layout_type (tree type) if (integer_zerop (element_size)) length = size_zero_node; - /* The initial subtraction should happen in the original type so + /* The computation should happen in the original type so that (possible) negative values are handled appropriately. */ else length - = size_binop (PLUS_EXPR, size_one_node, - fold_convert (sizetype, - fold_build2 (MINUS_EXPR, - TREE_TYPE (lb), - ub, lb))); + = fold_convert (sizetype, + fold_build2 (PLUS_EXPR, TREE_TYPE (lb), + build_int_cst (TREE_TYPE (lb), 1), + fold_build2 (MINUS_EXPR, + TREE_TYPE (lb), + ub, lb))); TYPE_SIZE (type) = size_binop (MULT_EXPR, element_size, fold_convert (bitsizetype, @@ -2249,7 +2250,8 @@ initialize_sizetypes (void) TYPE_SIZE_UNIT (t) = build_int_cst (t, GET_MODE_SIZE (SImode)); TYPE_PRECISION (t) = precision; - set_min_and_max_values_for_integral_type (t, precision, true); + set_min_and_max_values_for_integral_type (t, precision, + /*is_unsigned=*/true); sizetype = t; bitsizetype = build_distinct_type_copy (t); @@ -2284,7 +2286,6 @@ set_sizetype (tree type) /* We want to use sizetype's cache, as we will be replacing that type. */ TYPE_CACHED_VALUES (t) = TYPE_CACHED_VALUES (sizetype); TYPE_CACHED_VALUES_P (t) = TYPE_CACHED_VALUES_P (sizetype); - TREE_TYPE (TYPE_CACHED_VALUES (t)) = type; TYPE_UID (t) = TYPE_UID (sizetype); TYPE_IS_SIZETYPE (t) = 1; -- 2.30.2