]> git.ipfire.org Git - thirdparty/gcc.git/commit
Fortran: error recovery while simplifying expressions [PR103707,PR106987]
authorHarald Anlauf <anlauf@gmx.de>
Tue, 5 Mar 2024 20:54:26 +0000 (21:54 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Wed, 6 Mar 2024 16:55:36 +0000 (17:55 +0100)
commit93e1d4d24ed014387da97e2ce11556d68fe98e66
treebe4c5d6e459f304ccdb437da227a0d11bf11135a
parentdc6c3bfb59baab28b998e18396c06087b6d9b0ed
Fortran: error recovery while simplifying expressions [PR103707,PR106987]

When an exception is encountered during simplification of arithmetic
expressions, the result may depend on whether range-checking is active
(-frange-check) or not.  However, the code path in the front-end should
stay the same for "soft" errors for which the exception is triggered by the
check, while "hard" errors should always terminate the simplification, so
that error recovery is independent of the flag.  Separation of arithmetic
error codes into "hard" and "soft" errors shall be done consistently via
is_hard_arith_error().

PR fortran/103707
PR fortran/106987

gcc/fortran/ChangeLog:

* arith.cc (is_hard_arith_error): New helper function to determine
whether an arithmetic error is "hard" or not.
(check_result): Use it.
(gfc_arith_divide): Set "Division by zero" only for regular
numerators of real and complex divisions.
(reduce_unary): Use is_hard_arith_error to determine whether a hard
or (recoverable) soft error was encountered.  Terminate immediately
on hard error, otherwise remember code of first soft error.
(reduce_binary_ac): Likewise.
(reduce_binary_ca): Likewise.
(reduce_binary_aa): Likewise.

gcc/testsuite/ChangeLog:

* gfortran.dg/pr99350.f90:
* gfortran.dg/arithmetic_overflow_3.f90: New test.
gcc/fortran/arith.cc
gcc/testsuite/gfortran.dg/arithmetic_overflow_3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr99350.f90