[Ada] Small tweaks to couple of Value routines
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 6 Nov 2020 12:51:45 +0000 (13:51 +0100)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 27 Nov 2020 09:16:05 +0000 (04:16 -0500)
gcc/ada/

* libgnat/s-valuef.adb (Integer_To_Fixed): Take into account the
extra digit when scaling up the input.
* libgnat/s-valuer.adb (Scan_Decimal_Digits): Restrict previous
change to fixed-point types.
(Scan_Integral_Digits): Likewise.

gcc/ada/libgnat/s-valuef.adb
gcc/ada/libgnat/s-valuer.adb

index f3ed5fa972c178e8d7dc8bdaebaf90dba009af65..caec598e9b32b3a1cc978f80031713d83e79c1b5 100644 (file)
@@ -227,8 +227,9 @@ package body System.Value_F is
             Z := N;
 
             for J in 1 .. LS loop
-               if V <= Uns'Last / Uns (B) then
-                  V := V * Uns (B);
+               if V <= (Uns'Last - E) / Uns (B) then
+                  V := V * Uns (B) + E;
+                  E := 0;
                else
                   Bad_Value (Str);
                end if;
index 0fa4fe1ac76b2ebb50b30e00ca2737a2e7bdc6fd..06d7adcbd7a29a3077346ff1660bef676c8aa5d3 100644 (file)
@@ -188,11 +188,13 @@ package body System.Value_R is
 
          --  If precision limit has been reached, just ignore any remaining
          --  digits for the computation of Value and Scale, but store the
-         --  first in Extra and use the second to round Extra. The scanning
-         --  should continue only to assess the validity of the string.
+         --  first in Extra and use the second to round Extra if this is for
+         --  a fixed-point type (we skip the rounding for a floating-point
+         --  type to preserve backward compatibility). The scanning should
+         --  continue only to assess the validity of the string.
 
          if Precision_Limit_Reached then
-            if Precision_Limit_Just_Reached then
+            if Precision_Limit_Just_Reached and then not Floating then
                if Digit >= Base / 2 then
                   if Extra = Base - 1 then
                      Extra := 0;
@@ -343,14 +345,16 @@ package body System.Value_R is
          end if;
 
          --  If precision limit has been reached, just ignore any remaining
-         --  digits for the computation of Value, but update Scale and store
-         --  the first in Extra and use the second to round Extra. The scanning
-         --  should continue only to assess the validity of the string.
+         --  digits for the computation of Value and Scale, but store the
+         --  first in Extra and use the second to round Extra if this is for
+         --  a fixed-point type (we skip the rounding for a floating-point
+         --  type to preserve backward compatibility). The scanning should
+         --  continue only to assess the validity of the string.
 
          if Precision_Limit_Reached then
             Scale := Scale + 1;
 
-            if Precision_Limit_Just_Reached then
+            if Precision_Limit_Just_Reached and then not Floating then
                if Digit >= Base / 2 then
                   if Extra = Base - 1 then
                      Extra := 0;