[Ada] Raise Constraint_Error in overflow case involving rounding
authorYannick Moy <moy@adacore.com>
Tue, 17 Sep 2019 08:02:30 +0000 (08:02 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 17 Sep 2019 08:02:30 +0000 (08:02 +0000)
commitd4ba72cbad263d9b4fd211534c117343ed5333a1
tree7a0e5a8389c0d2c6332239dfe378189aa472a311
parent7197e2db28f10dec509967bb1cbd2d74cb03ee7e
[Ada] Raise Constraint_Error in overflow case involving rounding

Function Scaled_Divide in s-arith runtime unit computes the combined
multiplication and division of its arguments ((X*Y) / Z). In a very
special case where the quotient computed before rounding is 2**64-1,
then rounding may lead to undesirable wrap-around, leading to a computed
quotient of 0 instead of raising Constraint_Error as expected.

This function is only called in the runtime for arithmetic operations
involving fixed-point types. Rounding is performed only when the target
type is of a decimal fixed-point type, and the attribute 'Round of the
type is used to round the result of the arithmetic operation.

This fix correctly raises Constraint_Error in this special case.

2019-09-17  Yannick Moy  <moy@adacore.com>

gcc/ada/

* libgnat/s-arit64.adb (Scaled_Divide): Add protection against
undesirable wrap-around.

gcc/testsuite/

* gnat.dg/multfixed.adb: New testcase.

From-SVN: r275791
gcc/ada/ChangeLog
gcc/ada/libgnat/s-arit64.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/multfixed.adb [new file with mode: 0644]