Commit dcbac1a4 by Eric Botcazou Committed by Eric Botcazou

re PR ada/56474 (bogus Storage_Error raised for record containing empty zero-based array)

	PR ada/56474
	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Subtype>: Use
	int_const_binop to shift bounds by 1 when they are integer constants.

From-SVN: r198663
parent 14523c25
2013-05-07 Eric Botcazou <ebotcazou@adacore.com>
PR ada/56474
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Subtype>: Use
int_const_binop to shift bounds by 1 when they are integer constants.
2013-04-25 Arnaud Charlet <charlet@adacore.com> 2013-04-25 Arnaud Charlet <charlet@adacore.com>
* gcc-interface/Makefile.in (ADA_EXCLUDE_SRCS): Exclude s-init.ad{s,b} * gcc-interface/Makefile.in (ADA_EXCLUDE_SRCS): Exclude s-init.ad{s,b}
......
...@@ -2447,15 +2447,17 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -2447,15 +2447,17 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
gnu_orig_max, gnu_orig_max,
gnu_orig_min), gnu_orig_min),
gnu_min, gnu_min,
size_binop (PLUS_EXPR, gnu_max, int_const_binop (PLUS_EXPR, gnu_max,
size_one_node)); size_one_node));
} }
/* Finally we use (hb >= lb) ? hb : lb - 1 for the upper bound /* Finally we use (hb >= lb) ? hb : lb - 1 for the upper bound
in all the other cases. Note that, here as well as above, in all the other cases. Note that, here as well as above,
the condition used in the comparison must be equivalent to the condition used in the comparison must be equivalent to
the condition (length != 0). This is relied upon in order the condition (length != 0). This is relied upon in order
to optimize array comparisons in compare_arrays. */ to optimize array comparisons in compare_arrays. Moreover
we use int_const_binop for the shift by 1 if the bound is
constant to avoid any unwanted overflow. */
else else
gnu_high gnu_high
= build_cond_expr (sizetype, = build_cond_expr (sizetype,
...@@ -2464,8 +2466,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -2464,8 +2466,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
gnu_orig_max, gnu_orig_max,
gnu_orig_min), gnu_orig_min),
gnu_max, gnu_max,
size_binop (MINUS_EXPR, gnu_min, TREE_CODE (gnu_min) == INTEGER_CST
size_one_node)); ? int_const_binop (MINUS_EXPR, gnu_min,
size_one_node)
: size_binop (MINUS_EXPR, gnu_min,
size_one_node));
/* Reuse the index type for the range type. Then make an index /* Reuse the index type for the range type. Then make an index
type with the size range in sizetype. */ type with the size range in sizetype. */
......
2013-05-07 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/array3.ads: New test.
2013-05-06 Marc Glisse <marc.glisse@inria.fr> 2013-05-06 Marc Glisse <marc.glisse@inria.fr>
* c-c++-common/vector-scalar-2.c: New testcase. * c-c++-common/vector-scalar-2.c: New testcase.
......
-- PR middle-end/56474
-- Reported by Pavel Zhukov <pavel@zhukoff.net>
-- { dg-do compile }
with Ada.Streams;
package Array3 is
use type Ada.Streams.Stream_Element_Offset;
type Vector (Size : Ada.Streams.Stream_Element_Offset) is record
Value : Ada.Streams.Stream_Element_Array (0 .. Size);
end record;
Empty_Vector : Vector (-1);
end Array3;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment