diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2016-10-10 08:47:52 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2016-10-10 08:47:52 +0000 |
commit | 55cfd746c7d6e262d01a3cb8d5f32ebc8dceffbc (patch) | |
tree | cd931049bd8d161a77d9a6701765ae10189b47a7 /gcc/ada/gcc-interface/utils.c | |
parent | f47ef399b62fdab4fdddc308885f3da986825c21 (diff) | |
download | gcc-55cfd746c7d6e262d01a3cb8d5f32ebc8dceffbc.zip gcc-55cfd746c7d6e262d01a3cb8d5f32ebc8dceffbc.tar.gz gcc-55cfd746c7d6e262d01a3cb8d5f32ebc8dceffbc.tar.bz2 |
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
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index d4cc941..8db92e5 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -4193,12 +4193,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 @@ -4502,7 +4505,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), |