]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Make __int128 meet integer-class requirements [PR 96042]
authorJonathan Wakely <jwakely@redhat.com>
Wed, 19 Aug 2020 15:27:25 +0000 (16:27 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 19 Aug 2020 15:49:07 +0000 (16:49 +0100)
commit386fd16c551188e20d5b1684b7139e4269f9a739
tree8794a3bd26919abf77675933a9b48be10eae18dc
parent4432066509441cb6ec3e6688a523f9946e7b5d21
libstdc++: Make __int128 meet integer-class requirements [PR 96042]

Because __int128 can be used as the difference type for iota_view, we
need to ensure that it meets the requirements of an integer-class type.
The requirements in [iterator.concept.winc] p10 include numeric_limits
being specialized and giving meaningful answers. Currently we only
specialize numeric_limits for non-standard integer types in non-strict
modes.  However, nothing prevents us from defining an explicit
specialization for any implementation-defined type, so it doesn't matter
whether std::is_integral<__int128> is true or not.

This patch ensures that the numeric_limits specializations for signed
and unsigned __int128 are defined whenever __int128 is available. It
also makes the __numeric_traits and __int_limits helpers work for
__int128, via a new __gnu_cxx::__is_integer_nonstrict trait.

libstdc++-v3/ChangeLog:

PR libstdc++/96042
* include/ext/numeric_traits.h (__is_integer_nonstrict): New
trait which is true for 128-bit integers even in strict modes.
(__numeric_traits_integer, __numeric_traits): Use
__is_integer_nonstrict instead of __is_integer.
* include/std/limits [__STRICT_ANSI__ && __SIZEOF_INT128__]
(numeric_limits<__int128>, (numeric_limits<unsigned __int128>):
Define.
* testsuite/std/ranges/iota/96042.cc: New test.
libstdc++-v3/include/ext/numeric_traits.h
libstdc++-v3/include/std/limits
libstdc++-v3/testsuite/std/ranges/iota/96042.cc [new file with mode: 0644]