Commit 2323a580 by Eric Botcazou Committed by Eric Botcazou

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
parent a1b80ec7
2014-01-12 Eric Botcazou <ebotcazou@adacore.com>
PR ada/59772
* gcc-interface/cuintp.c (build_cst_from_int): Use 32-bit integer type
as intermediate type.
(UI_To_gnu): Likewise.
2014-01-03 Eric Botcazou <ebotcazou@adacore.com> 2014-01-03 Eric Botcazou <ebotcazou@adacore.com>
* gnatvsn.ads (Current_Year): Bump to 2014. * gnatvsn.ads (Current_Year): Bump to 2014.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* * * *
* C Implementation File * * 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 * * 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- * * terms of the GNU General Public License as published by the Free Soft- *
...@@ -55,7 +55,7 @@ static tree ...@@ -55,7 +55,7 @@ static tree
build_cst_from_int (tree type, HOST_WIDE_INT low) build_cst_from_int (tree type, HOST_WIDE_INT low)
{ {
if (SCALAR_FLOAT_TYPE_P (type)) 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 else
return build_int_cst_type (type, low); return build_int_cst_type (type, low);
} }
...@@ -89,19 +89,12 @@ UI_To_gnu (Uint Input, tree type) ...@@ -89,19 +89,12 @@ UI_To_gnu (Uint Input, tree type)
gcc_assert (Length > 0); gcc_assert (Length > 0);
/* The computations we perform below always require a type at least as /* 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 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 base integer type node for the computations in this case and will
convert the final result back to the incoming type later on. convert the final result back to the incoming type later on. */
The base integer precision must be superior than 16. */ if (!SCALAR_FLOAT_TYPE_P (comp_type) && TYPE_PRECISION (comp_type) < 32)
comp_type = gnat_type_for_size (32, 0);
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);
}
gnu_base = build_cst_from_int (comp_type, Base); gnu_base = build_cst_from_int (comp_type, Base);
......
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