re PR ada/59772 (floating-point constants are not correctly encoded)
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 12 Jan 2014 14:29:12 +0000 (14:29 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 12 Jan 2014 14:29:12 +0000 (14:29 +0000)
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

gcc/ada/ChangeLog
gcc/ada/gcc-interface/cuintp.c

index 153b424..a0570a5 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        * gnatvsn.ads (Current_Year): Bump to 2014.
index bbe62c1..c5736f5 100644 (file)
@@ -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);