Commit 55cfd746 by Eric Botcazou Committed by Eric Botcazou

utils.c (convert): For a biased input type, convert the bias itself to the base…

utils.c (convert): For a biased input type, convert the bias itself to the base type before adding it.

	* gcc-interface/utils.c (convert): For a biased input type, convert
	the bias itself to the base type before adding it.

From-SVN: r240910
parent f47ef399
2016-10-10 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (convert): For a biased input type, convert
the bias itself to the base type before adding it.
2016-10-08 Eric Botcazou <ebotcazou@adacore.com> 2016-10-08 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (convert) <VECTOR_CST>: Add missing break. * gcc-interface/utils.c (convert) <VECTOR_CST>: Add missing break.
......
...@@ -4193,12 +4193,15 @@ convert (tree type, tree expr) ...@@ -4193,12 +4193,15 @@ convert (tree type, tree expr)
return convert (type, unpadded); return convert (type, unpadded);
} }
/* If the input is a biased type, adjust first. */ /* If the input is a biased type, convert first to the base type and add
the bias. Note that the bias must go through a full conversion to the
base type, lest it is itself a biased value; this happens for subtypes
of biased types. */
if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype)) if (ecode == INTEGER_TYPE && TYPE_BIASED_REPRESENTATION_P (etype))
return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype), return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype),
fold_convert (TREE_TYPE (etype), expr), fold_convert (TREE_TYPE (etype), expr),
fold_convert (TREE_TYPE (etype), convert (TREE_TYPE (etype),
TYPE_MIN_VALUE (etype)))); TYPE_MIN_VALUE (etype))));
/* If the input is a justified modular type, we need to extract the actual /* If the input is a justified modular type, we need to extract the actual
object before converting it to any other type with the exceptions of an object before converting it to any other type with the exceptions of an
...@@ -4502,7 +4505,12 @@ convert (tree type, tree expr) ...@@ -4502,7 +4505,12 @@ convert (tree type, tree expr)
&& (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE && (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE
|| (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype)))) || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype))))
return unchecked_convert (type, expr, false); return unchecked_convert (type, expr, false);
else if (TYPE_BIASED_REPRESENTATION_P (type))
/* If the output is a biased type, convert first to the base type and
subtract the bias. Note that the bias itself must go through a full
conversion to the base type, lest it is a biased value; this happens
for subtypes of biased types. */
if (TYPE_BIASED_REPRESENTATION_P (type))
return fold_convert (type, return fold_convert (type,
fold_build2 (MINUS_EXPR, TREE_TYPE (type), fold_build2 (MINUS_EXPR, TREE_TYPE (type),
convert (TREE_TYPE (type), expr), convert (TREE_TYPE (type), expr),
......
2016-10-10 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/biased_subtype.adb: New test.
2016-10-09 Jakub Jelinek <jakub@redhat.com> 2016-10-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/77901 PR tree-optimization/77901
......
-- { dg-do run }
-- { dg-options "-gnatws" }
procedure Biased_Subtype is
CIM_Max_AA : constant := 9_999_999;
CIM_Min_AA : constant := -999_999;
type TIM_AA is range CIM_Min_AA..CIM_Max_AA + 1;
for TIM_AA'Size use 24;
subtype STIM_AA is TIM_AA range TIM_AA(CIM_Min_AA)..TIM_AA(CIM_Max_AA);
SAA : STIM_AA := 1;
begin
if Integer(SAA) /= 1 then
raise Program_Error;
end if;
end;
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