From 51a2a98de7be36a142d9ad31344a5a3470ad2c89 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 10 Oct 2016 08:53:06 +0000 Subject: [PATCH] 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: r240912 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/utils.c | 16 ++++++++++++---- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/biased_subtype.adb | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/biased_subtype.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 9b0a98b57623..d6dc7e6c0c82 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2016-10-10 Eric Botcazou + + * gcc-interface/utils.c (convert): For a biased input type, convert + the bias itself to the base type before adding it. + 2016-06-03 Release Manager * GCC 5.4.0 released. diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 68340122b5c6..ce53e93d9b3d 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -4086,12 +4086,15 @@ convert (tree type, tree expr) 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)) return convert (type, fold_build2 (PLUS_EXPR, TREE_TYPE (etype), fold_convert (TREE_TYPE (etype), expr), - fold_convert (TREE_TYPE (etype), - TYPE_MIN_VALUE (etype)))); + convert (TREE_TYPE (etype), + TYPE_MIN_VALUE (etype)))); /* 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 @@ -4393,7 +4396,12 @@ convert (tree type, tree expr) && (ecode == ARRAY_TYPE || ecode == UNCONSTRAINED_ARRAY_TYPE || (ecode == RECORD_TYPE && TYPE_CONTAINS_TEMPLATE_P (etype)))) 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, fold_build2 (MINUS_EXPR, TREE_TYPE (type), convert (TREE_TYPE (type), expr), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7d71d00c1e8e..7f4de6278537 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-10-10 Eric Botcazou + + * gnat.dg/biased_subtype.adb: New test. + 2016-10-05 Steven G. Kargl PR fortran/58991 diff --git a/gcc/testsuite/gnat.dg/biased_subtype.adb b/gcc/testsuite/gnat.dg/biased_subtype.adb new file mode 100644 index 000000000000..38330229632e --- /dev/null +++ b/gcc/testsuite/gnat.dg/biased_subtype.adb @@ -0,0 +1,20 @@ +-- { 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; -- 2.47.2