trans.c (emit_range_check): Do not emit the check if the base type of the expression is the type against...

* trans.c (emit_range_check): Do not emit the check if the base type
	of the expression is the type against which its range must be checked.

From-SVN: r133083
This commit is contained in:
Eric Botcazou 2008-03-10 19:26:35 +00:00 committed by Eric Botcazou
parent 725c2d321c
commit e1e7141cf3
4 changed files with 27 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2008-03-10 Eric Botcazou <ebotcazou@adacore.com>
* trans.c (emit_range_check): Do not emit the check if the base type
of the expression is the type against which its range must be checked.
2008-03-08 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (maybe_pad_type): Use value_factor_p.

View File

@ -5757,6 +5757,11 @@ emit_range_check (tree gnu_expr, Entity_Id gnat_range_type)
tree gnu_high = TYPE_MAX_VALUE (gnu_range_type);
tree gnu_compare_type = get_base_type (TREE_TYPE (gnu_expr));
/* If GNU_EXPR has GNAT_RANGE_TYPE as its base type, no check is needed.
This can for example happen when translating 'Val or 'Value. */
if (gnu_compare_type == gnu_range_type)
return gnu_expr;
/* If GNU_EXPR has an integral type that is narrower than GNU_RANGE_TYPE,
we can't do anything since we might be truncating the bounds. No
check is needed in this case. */

View File

@ -1,3 +1,7 @@
2008-03-10 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/range_check2.adb: New test.
2008-03-10 H.J. Lu <hongjiu.lu@intel.com>
PR tree-optimization/35494

View File

@ -0,0 +1,13 @@
-- { dg-do compile }
-- { dg-options "-O2" }
procedure Range_Check2 is
subtype Block_Subtype is String(1 .. 6);
type Color is (Black, Red, Green, Yellow, Blue, Magenta, Cyan, White);
Foregrnd_Color : Color := White;
Block : Block_Subtype := "123456";
begin
Foregrnd_Color := Color'Val(Integer'Value(Block(5 .. 6)));
end;