stor-layout.c (layout_type): Compute all array index size operations in the original...
authorRichard Guenther <rguenther@suse.de>
Mon, 11 Apr 2011 15:47:30 +0000 (15:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 11 Apr 2011 15:47:30 +0000 (15:47 +0000)
2011-04-11  Richard Guenther  <rguenther@suse.de>

* 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
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/stor-layout.c

index f0ed08a334ab3061fbe9e5c8bb14b05e55bb02a9..5363fe3a49d3c4f3cc1258765613dee68e9f7498 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-11  Richard Guenther  <rguenther@suse.de>
+
+       * 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  <joseph@codesourcery.com>
 
        * common.opt (Tbss=, Tdata=, Ttext=): New options.
index af66edaf103194d8bc6fd4cd5a76dff014269d17..780036e92e712e79a102c764c0222aab02f97018 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-11  Richard Guenther  <rguenther@suse.de>
+
+       * c-common.c (complete_array_type): Build a range type of
+       proper type.
+
 2011-04-08  Nathan Froyd  <froydnj@codesourcery.com>
 
        * c-common.c (handle_sentinel_attribute): Don't use TYPE_ARG_TYPES.
index 63444b8d12980ad27d1d5328b482118771cdface..030e3c6d11677c54569b907b1ca1f338352ba10f 100644 (file)
@@ -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. */
index a225dbfbd8bb8e72111c739140855450dbbfcc84..ea0d44d64d26880bd91948ca6cb27d92bf928aeb 100644 (file)
@@ -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;