From: Eric Botcazou Date: Fri, 6 Nov 2020 12:51:45 +0000 (+0100) Subject: [Ada] Small tweaks to couple of Value routines X-Git-Tag: basepoints/gcc-12~2770 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=def0e5b83ddb5d4916d0e804b9044f73ffb2923c;p=thirdparty%2Fgcc.git [Ada] Small tweaks to couple of Value routines 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 --git a/gcc/ada/libgnat/s-valuef.adb b/gcc/ada/libgnat/s-valuef.adb index f3ed5fa972c1..caec598e9b32 100644 --- 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 index 0fa4fe1ac76b..06d7adcbd7a2 100644 --- 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;