fortran: fix handling of options -ffpe-trap and -ffpe-summary [PR110957]

gcc/fortran/ChangeLog:

	PR fortran/110957
	* invoke.texi: Update documentation to reflect '-ffpe-trap=none'.
	* options.cc (gfc_handle_fpe_option): Fix mixup up of error messages
	for options -ffpe-trap and -ffpe-summary.  Accept '-ffpe-trap=none'
	to clear FPU traps previously set on command line.
This commit is contained in:
Harald Anlauf 2023-10-06 22:21:56 +02:00
parent 8be20f3b0b
commit 458c253ccd
2 changed files with 10 additions and 5 deletions

View file

@ -1294,7 +1294,8 @@ Specify a list of floating point exception traps to enable. On most
systems, if a floating point exception occurs and the trap for that
exception is enabled, a SIGFPE signal will be sent and the program
being aborted, producing a core file useful for debugging. @var{list}
is a (possibly empty) comma-separated list of the following
is a (possibly empty) comma-separated list of either @samp{none} (to
clear the set of exceptions to be trapped), or of the following
exceptions: @samp{invalid} (invalid floating point operation, such as
@code{SQRT(-1.0)}), @samp{zero} (division by zero), @samp{overflow}
(overflow in a floating point operation), @samp{underflow} (underflow
@ -1314,7 +1315,8 @@ If the option is used more than once in the command line, the lists will
be joined: '@code{ffpe-trap=}@var{list1} @code{ffpe-trap=}@var{list2}'
is equivalent to @code{ffpe-trap=}@var{list1},@var{list2}.
Note that once enabled an exception cannot be disabled (no negative form).
Note that once enabled an exception cannot be disabled (no negative form),
except by clearing all traps by specifying @samp{none}.
Many, if not most, floating point operations incur loss of precision
due to rounding, and hence the @code{ffpe-trap=inexact} is likely to

View file

@ -555,9 +555,12 @@ gfc_handle_fpe_option (const char *arg, bool trap)
pos++;
result = 0;
if (!trap && strncmp ("none", arg, pos) == 0)
if (strncmp ("none", arg, pos) == 0)
{
gfc_option.fpe_summary = 0;
if (trap)
gfc_option.fpe = 0;
else
gfc_option.fpe_summary = 0;
arg += pos;
pos = 0;
continue;
@ -586,7 +589,7 @@ gfc_handle_fpe_option (const char *arg, bool trap)
break;
}
}
if (!result && !trap)
if (!result && trap)
gfc_fatal_error ("Argument to %<-ffpe-trap%> is not valid: %s", arg);
else if (!result)
gfc_fatal_error ("Argument to %<-ffpe-summary%> is not valid: %s", arg);