diff mbox series

[Ada] Small tweaks to couple of Value routines

Message ID 20201127091801.GA63358@adacore.com
State New
Headers show
Series [Ada] Small tweaks to couple of Value routines | expand

Commit Message

Pierre-Marie de Rodat Nov. 27, 2020, 9:18 a.m. UTC
This fixes a minor oversight in Integer_To_Fixed and restricts the
previous change to System.Value_R.Scan_Raw_Real for the sake of
backward compatibility with earlier conversions of the compiler.

Tested on x86_64-pc-linux-gnu, committed on trunk

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.
diff mbox series

Patch

diff --git a/gcc/ada/libgnat/s-valuef.adb b/gcc/ada/libgnat/s-valuef.adb
--- a/gcc/ada/libgnat/s-valuef.adb
+++ b/gcc/ada/libgnat/s-valuef.adb
@@ -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;


diff --git a/gcc/ada/libgnat/s-valuer.adb b/gcc/ada/libgnat/s-valuer.adb
--- a/gcc/ada/libgnat/s-valuer.adb
+++ b/gcc/ada/libgnat/s-valuer.adb
@@ -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;