public inbox for libstdc++-cvs@sourceware.org help / color / mirror / Atom feed
From: Nathan Sidwell <nathan@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc/devel/c++-modules] libstdc++: Make incrementable<__int128> satisfied in strict mode Date: Fri, 28 Aug 2020 15:58:20 +0000 (GMT) [thread overview] Message-ID: <20200828155820.79749386180E@sourceware.org> (raw) https://gcc.gnu.org/g:5e9ad288eb6fb366142b166e7985d16727b398e1 commit 5e9ad288eb6fb366142b166e7985d16727b398e1 Author: Jonathan Wakely <jwakely@redhat.com> Date: Thu Aug 20 19:41:15 2020 +0100 libstdc++: Make incrementable<__int128> satisfied in strict mode This adds specializations of std::incrementable_traits so that 128-bit integers are always considered incrementable (and therefore usable with std::ranges::iota_view) even when they don't satisfy std::integral. libstdc++-v3/ChangeLog: * include/bits/iterator_concepts.h [__STRICT_ANSI__] (incrementable_traits<__int128>): Define specialization. (incrementable_traits<unsigned __int128>): Likewise. * testsuite/std/ranges/iota/96042.cc: Test iota_view with __int128. Diff: --- libstdc++-v3/include/bits/iterator_concepts.h | 11 ++++++++++ libstdc++-v3/testsuite/std/ranges/iota/96042.cc | 28 ++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h index 5033f2bddc3..bd6660c5f22 100644 --- a/libstdc++-v3/include/bits/iterator_concepts.h +++ b/libstdc++-v3/include/bits/iterator_concepts.h @@ -173,6 +173,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = make_signed_t<decltype(std::declval<_Tp>() - std::declval<_Tp>())>; }; +#if defined __STRICT_ANSI__ && defined __SIZEOF_INT128__ + // __int128 is incrementable even if !integral<__int128> + template<> + struct incrementable_traits<__int128> + { using difference_type = __int128; }; + + template<> + struct incrementable_traits<unsigned __int128> + { using difference_type = __int128; }; +#endif + namespace __detail { // An iterator such that iterator_traits<_Iter> names a specialization diff --git a/libstdc++-v3/testsuite/std/ranges/iota/96042.cc b/libstdc++-v3/testsuite/std/ranges/iota/96042.cc index 6f5c8f61fd2..911663bc413 100644 --- a/libstdc++-v3/testsuite/std/ranges/iota/96042.cc +++ b/libstdc++-v3/testsuite/std/ranges/iota/96042.cc @@ -24,8 +24,33 @@ void test01() { // PR libstdc++/96042 - using V = std::ranges::iota_view<long long, int>; + using V = std::ranges::iota_view<long long, long long>; + + // In strict -std=c++20 mode there is no integer wider than long long, + // so V's difference type is an integer-class type, [iterator.concept.winc]. + // In practice this is either __int128 or __detail::__max_diff_type. using D = std::ranges::range_difference_t<V>; + // Ensure that numeric_limits is correctly specialized for the type. + using L = std::numeric_limits<D>; + static_assert( L::is_specialized ); + static_assert( L::is_signed ); + static_assert( L::is_integer ); + static_assert( L::is_exact ); + static_assert( L::digits > std::numeric_limits<long long>::digits ); + static_assert( L::digits10 == static_cast<int>(L::digits * 0.30103) ); + static_assert( L::min() == (D(1) << L::digits) ); + static_assert( L::max() == ~L::min() ); + static_assert( L::lowest() == L::min() ); +} + +#ifdef __SIZEOF_INT128__ +void +test02() +{ + // When the target supports __int128 it can be used in iota_view + // even in strict mode where !integral<__int128>. + using V = std::ranges::iota_view<__int128, __int128>; + using D = std::ranges::range_difference_t<V>; // __detail::__max_diff_type using L = std::numeric_limits<D>; static_assert( L::is_specialized ); static_assert( L::is_signed ); @@ -37,3 +62,4 @@ test01() static_assert( L::max() == ~L::min() ); static_assert( L::lowest() == L::min() ); } +#endif
reply other threads:[~2020-08-28 15:58 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200828155820.79749386180E@sourceware.org \ --to=nathan@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).