On Tue, Sep 21, 2021 at 5:19 PM Jason Merrill <ja...@redhat.com> wrote:

> On Tue, Sep 21, 2021 at 4:30 PM Joseph Myers <jos...@codesourcery.com>
> wrote:
>
>> On Tue, 21 Sep 2021, Jakub Jelinek via Gcc-patches wrote:
>>
>> > On Tue, Sep 21, 2021 at 02:15:59PM +0100, Roger Sayle wrote:
>> > > Can you double check?  Integer division by zero is undefined, but
>> isn't floating point
>> > > division by zero defined by the appropriate IEEE standards?
>> >
>> > https://eel.is/c++draft/expr.mul#4 doesn't make the division by zero
>> > behavior conditional on integral types.
>> > C has similar wording.
>>
>> The position for C is that Annex F semantics take precedence over all the
>> ways in which floating-point arithmetic has undefined behavior in the
>> main
>> body of the standard.  So floating-point overflow and division by zero
>> are
>> fully defined in the presence of Annex F support, while out-of-range
>> conversions from floating point to integer types produce an unspecified
>> value (not necessarily the same unspecified value for different
>> executions
>> of the conversion in the abstract machine - as discussed in bug 93806,
>> GCC
>> can get that wrong and act as if a single execution of such a conversion
>> in the abstract machine produces more than one result).
>>
>> In C, as specified in Annex F, initializers for floating-point objects
>> with static or thread storage duration are evaluated with exceptions
>> discarded and the default rounding mode in effect; 7.0 / 0.0 is a fully
>> valid initializer for such an object to initialize it to positive
>> infinity.  As I understand it, the question for this thread is whether
>> C++
>> constexpr should have a similar rule to C static initializers (which
>> ought
>> to apply to 1.0 / 3.0, raising inexact, just as much as to 7.0 / 0.0).
>>
>
> The C rules seem to be
>
> F.8.2 Translation
> During translation the IEC 60559 default modes are in effect:
>  — The rounding direction mode is rounding to nearest.
>  — The rounding precision mode (if supported) is set so that results are
> not shortened.
>  — Trapping or stopping (if supported) is disabled on all floating-point
> exceptions.
> Recommended practice:
> The implementation should produce a diagnostic message for each
> translation-time floating-point exception, other than “inexact”; the
> implementation should then proceed with the translation of the program.
>
> I think following the same rules for C++ would be appropriate in a
> diagnosing context: warn and continue.  In a template argument deduction
> (SFINAE) context, where errors become silent substitution failures, it's
> probably better to treat them as non-constant.
>

I've now added -fconstexpr-fp-except to treat manifestly-constant-evaluated
expressions the same as C static initializers for floating point
arithmetic.  This does not distinguish between diagnosing and SFINAE
context as I was suggesting above, and indeed neither front end currently
warns about compile-time exceptions as Annex F recommends.

Jason

Reply via email to