diff --git a/gcc/ada/libgnat/s-valuef.adb b/gcc/ada/libgnat/s-valuef.adb index f3ed5fa972c..caec598e9b3 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 0fa4fe1ac76..06d7adcbd7a 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;