https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87390

--- Comment #6 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> ---
(In reply to jos...@codesourcery.com from comment #5)
> It's 6.3.1.4 for conversions between real floating and integer types that, 
> in C99 but not C11, I think requires the resulting value to be 
> representable in the resulting real floating type.

No, it just requires the value to be in the range of values that can be
represented (which is always the case in practice, even though the C standard
does not forbid very long integers). Anyway, this is unrelated to the use of
extra precision and range.

Note that:
* 6.3.1.4 is about the behavior of conversion between real floating and
integer, for given types.
* 6.3.1.5 is about the behavior of conversion between real floating types, for
given types.
* 6.3.1.8 is about the selection of the arithmetic types (implicit
conversions).

Neither 6.3.1.4, nor 6.3.1.5 deals with semantic vs evaluation type (6.3.1.5
mentions "greater precision and range than required by its semantic type", but
*only* for the other direction, in an *explicit* conversion). It is 6.3.1.8
that deals with the rules about extra precision and range.

BTW, note 52 of 6.3.1.8 says "The cast and assignment operators are still
required to perform their specified conversions as described in 6.3.1.4 and
6.3.1.5." i.e. mentioning both 6.3.1.4 and 6.3.1.5, thus confirming that
implicit conversions of integer to real floating is also covered by the extra
precision and range (otherwise referencing 6.3.1.4 would be pointless). That
is, if d has type double,

  d + (1ULL << 63)

and

  d + (double) (1ULL << 63)

are handled differently.

Reply via email to