diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv index 389e1ad254a74..e7013f46a6371 100644 --- a/libcxx/docs/Status/Cxx23Issues.csv +++ b/libcxx/docs/Status/Cxx23Issues.csv @@ -143,7 +143,7 @@ "`LWG3598 `__","``system_category().default_error_condition(0)`` is underspecified","2022-02 (Virtual)","","","`#104945 `__","" "`LWG3601 `__","common_iterator's postfix-proxy needs ``indirectly_readable`` ","2022-02 (Virtual)","","","`#104946 `__","" "`LWG3607 `__","``contiguous_iterator`` should not be allowed to have custom ``iter_move`` and ``iter_swap`` behavior","2022-02 (Virtual)","|Nothing To Do|","","`#104947 `__","" -"`LWG3610 `__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","","","`#104948 `__","" +"`LWG3610 `__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","|Complete|","22","`#104948 `__","" "`LWG3612 `__","Inconsistent pointer alignment in ``std::format`` ","2022-02 (Virtual)","|Complete|","14","`#104949 `__","" "`LWG3616 `__","LWG 3498 seems to miss the non-member ``swap`` for ``basic_syncbuf`` ","2022-02 (Virtual)","|Complete|","18","`#104950 `__","" "`LWG3618 `__","Unnecessary ``iter_move`` for ``transform_view::iterator`` ","2022-02 (Virtual)","|Complete|","19","`#104951 `__","" diff --git a/libcxx/include/__ranges/iota_view.h b/libcxx/include/__ranges/iota_view.h index f66f3f9183fc7..0d618bec966f1 100644 --- a/libcxx/include/__ranges/iota_view.h +++ b/libcxx/include/__ranges/iota_view.h @@ -355,7 +355,7 @@ class iota_view : public view_interface> { _LIBCPP_HIDE_FROM_ABI constexpr auto size() const requires(same_as<_Start, _BoundSentinel> && __advanceable<_Start>) || - (integral<_Start> && integral<_BoundSentinel>) || sized_sentinel_for<_BoundSentinel, _Start> + (__integer_like<_Start> && __integer_like<_BoundSentinel>) || sized_sentinel_for<_BoundSentinel, _Start> { if constexpr (__integer_like<_Start> && __integer_like<_BoundSentinel>) { return (__value_ < 0) diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/begin.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/begin.pass.cpp index 06419c1b14ee0..dbe052ea18287 100644 --- a/libcxx/test/std/ranges/range.factories/range.iota.view/begin.pass.cpp +++ b/libcxx/test/std/ranges/range.factories/range.iota.view/begin.pass.cpp @@ -40,6 +40,10 @@ constexpr void testType() { constexpr bool test() { testType(); +#ifndef TEST_HAS_NO_INT128 + testType<__int128_t>(); + testType<__uint128_t>(); +#endif testType(); testType(); testType(); diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/end.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/end.pass.cpp index 6abbef55b6ba7..d12079fdb5eec 100644 --- a/libcxx/test/std/ranges/range.factories/range.iota.view/end.pass.cpp +++ b/libcxx/test/std/ranges/range.factories/range.iota.view/end.pass.cpp @@ -61,6 +61,14 @@ constexpr void testType(U u) { constexpr bool test() { testType(SomeInt(10)); testType(IntComparableWith(SomeInt(10))); +#ifndef TEST_HAS_NO_INT128 + testType<__int128_t>(__int128_t(10)); + testType<__uint128_t>(__uint128_t(10)); +#endif + testType(10LL); + testType(10ULL); + testType(IntComparableWith(10)); + testType(IntComparableWith(10)); testType(IntComparableWith(10)); testType(IntComparableWith(10)); testType(IntComparableWith(10)); diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/star.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/star.pass.cpp index 570c74e29c686..b776d90c5e5e3 100644 --- a/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/star.pass.cpp +++ b/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/star.pass.cpp @@ -81,6 +81,12 @@ constexpr void testType() { constexpr bool test() { testType(); testType(); +#ifndef TEST_HAS_NO_INT128 + testType<__int128_t>(); + testType<__uint128_t>(); +#endif + testType(); + testType(); testType(); testType(); testType(); diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/subscript.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/subscript.pass.cpp index 0e5aca0dd554c..786b63dfeedee 100644 --- a/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/subscript.pass.cpp +++ b/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/subscript.pass.cpp @@ -47,6 +47,12 @@ constexpr void testType() { constexpr bool test() { testType(); +#ifndef TEST_HAS_NO_INT128 + testType<__int128_t>(); + testType<__uint128_t>(); +#endif + testType(); + testType(); testType(); testType(); testType(); diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/size.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/size.pass.cpp index 8563b85f65dbd..2b20e010fa2f5 100644 --- a/libcxx/test/std/ranges/range.factories/range.iota.view/size.pass.cpp +++ b/libcxx/test/std/ranges/range.factories/range.iota.view/size.pass.cpp @@ -16,8 +16,12 @@ #include #include "test_macros.h" +#include "type_algorithms.h" #include "types.h" +template +concept HasSize = requires(const T t) { t.size(); }; + constexpr bool test() { // Both are integer like and both are less than zero. { @@ -99,6 +103,15 @@ constexpr bool test() { assert(sz == 10); } + // LWG3610: `iota_view::size` sometimes rejects integer-class types + { + types::for_each(types::integer_types{}, []() { + types::for_each(types::integer_types{}, []() { + static_assert(HasSize>); + }); + }); + } + return true; }