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

--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Harald van Dijk from comment #2)
> __int128 behaves mostly like an integer type but is not an "extended integer
> type" as defined in the standard. Quoting from
> https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html: "GCC does
> not support any extended integer types." Extended integer types must meet
> specific requirements that __int128 does not meet: extended integer types
> cannot be larger than intmax_t, and __int128 is.

Right.

> Despite __int128 not being an extended integer type, there is nothing wrong
> with having __int128 enabled in standards-conforming mode. Out-of-range
> constants must be diagnosed, but they already are, and continuing to accept
> the program after that is valid.

Indeed, a warning is a diagnostic.

> The warning that is generated for the out-of-range constant is highly
> misleading though: the warning says "integer constant is so large that it is
> unsigned". Either the constant should be given an unsigned type, or the
> warning should be updated to reflect the type the constant actually gets.

Agreed.

Going back to David's original point:
Whether or not the implicit conversion to __int128 is enabled for strict modes,
the __int128 type itself needs to be enabled. Libstdc++ relies on it existing.

Reply via email to