diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-01-12 14:29:12 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2014-01-12 14:29:12 +0000 |
commit | 2323a580f1d1040883c4f2d0978c257cfa2be7e7 (patch) | |
tree | a95d5b1225994f15ea1be01d38c5355c7c031079 /gcc/ada/gcc-interface/cuintp.c | |
parent | a1b80ec7e0e9cea1107b77bdd1424ab853cda5c7 (diff) | |
download | gcc-2323a580f1d1040883c4f2d0978c257cfa2be7e7.zip gcc-2323a580f1d1040883c4f2d0978c257cfa2be7e7.tar.gz gcc-2323a580f1d1040883c4f2d0978c257cfa2be7e7.tar.bz2 |
re PR ada/59772 (floating-point constants are not correctly encoded)
PR ada/59772
* gcc-interface/cuintp.c (build_cst_from_int): Use 32-bit integer type
as intermediate type.
(UI_To_gnu): Likewise.
From-SVN: r206565
Diffstat (limited to 'gcc/ada/gcc-interface/cuintp.c')
-rw-r--r-- | gcc/ada/gcc-interface/cuintp.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/gcc/ada/gcc-interface/cuintp.c b/gcc/ada/gcc-interface/cuintp.c index bbe62c1..c5736f5 100644 --- a/gcc/ada/gcc-interface/cuintp.c +++ b/gcc/ada/gcc-interface/cuintp.c @@ -6,7 +6,7 @@ * * * C Implementation File * * * - * Copyright (C) 1992-2013, Free Software Foundation, Inc. * + * Copyright (C) 1992-2014, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -55,7 +55,7 @@ static tree build_cst_from_int (tree type, HOST_WIDE_INT low) { if (SCALAR_FLOAT_TYPE_P (type)) - return convert (type, build_int_cst (NULL_TREE, low)); + return convert (type, build_int_cst (gnat_type_for_size (32, 0), low)); else return build_int_cst_type (type, low); } @@ -89,19 +89,12 @@ UI_To_gnu (Uint Input, tree type) gcc_assert (Length > 0); /* The computations we perform below always require a type at least as - large as an integer not to overflow. REAL types are always fine, but + large as an integer not to overflow. FP types are always fine, but INTEGER or ENUMERAL types we are handed may be too short. We use a base integer type node for the computations in this case and will - convert the final result back to the incoming type later on. - The base integer precision must be superior than 16. */ - - if (TREE_CODE (comp_type) != REAL_TYPE - && TYPE_PRECISION (comp_type) - < TYPE_PRECISION (long_integer_type_node)) - { - comp_type = long_integer_type_node; - gcc_assert (TYPE_PRECISION (comp_type) > 16); - } + convert the final result back to the incoming type later on. */ + if (!SCALAR_FLOAT_TYPE_P (comp_type) && TYPE_PRECISION (comp_type) < 32) + comp_type = gnat_type_for_size (32, 0); gnu_base = build_cst_from_int (comp_type, Base); |