Skip to content
Open
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx23Issues.csv
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@
"`LWG3598 <https://wg21.link/LWG3598>`__","``system_category().default_error_condition(0)`` is underspecified","2022-02 (Virtual)","","",""
"`LWG3601 <https://wg21.link/LWG3601>`__","common_iterator's postfix-proxy needs ``indirectly_readable`` ","2022-02 (Virtual)","","",""
"`LWG3607 <https://wg21.link/LWG3607>`__","``contiguous_iterator`` should not be allowed to have custom ``iter_move`` and ``iter_swap`` behavior","2022-02 (Virtual)","|Nothing To Do|","",""
"`LWG3610 <https://wg21.link/LWG3610>`__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","","",""
"`LWG3610 <https://wg21.link/LWG3610>`__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","|Complete|","22",""
"`LWG3612 <https://wg21.link/LWG3612>`__","Inconsistent pointer alignment in ``std::format`` ","2022-02 (Virtual)","|Complete|","14",""
"`LWG3616 <https://wg21.link/LWG3616>`__","LWG 3498 seems to miss the non-member ``swap`` for ``basic_syncbuf`` ","2022-02 (Virtual)","|Complete|","18",""
"`LWG3618 <https://wg21.link/LWG3618>`__","Unnecessary ``iter_move`` for ``transform_view::iterator`` ","2022-02 (Virtual)","|Complete|","19",""
Expand Down
8 changes: 7 additions & 1 deletion libcxx/include/__ranges/iota_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,17 @@ struct __get_wider_signed {
return type_identity<int>{};
else if constexpr (sizeof(_Int) < sizeof(long))
return type_identity<long>{};
else if constexpr (sizeof(_Int) < sizeof(long long))
return type_identity<long long>{};
else
# if _LIBCPP_HAS_INT128
return type_identity<__int128_t>{};
# else
return type_identity<long long>{};

static_assert(
sizeof(_Int) <= sizeof(long long), "Found integer-like type that is bigger than largest integer like type.");
# endif
}

using type = typename decltype(__call())::type;
Expand Down Expand Up @@ -349,7 +355,7 @@ class iota_view : public view_interface<iota_view<_Start, _BoundSentinel>> {

_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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ constexpr void testType() {

constexpr bool test() {
testType<SomeInt>();
#ifndef TEST_HAS_NO_INT128
testType<__int128_t>();
testType<__uint128_t>();
#endif
testType<long long>();
testType<unsigned long long>();
testType<signed long>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@ constexpr void testType(U u) {
constexpr bool test() {
testType<SomeInt>(SomeInt(10));
testType<SomeInt>(IntComparableWith(SomeInt(10)));
#ifndef TEST_HAS_NO_INT128
testType<__int128_t>(__int128_t(10));
testType<__uint128_t>(__uint128_t(10));
#endif
testType<signed long long>(10LL);
testType<unsigned long long>(10ULL);
testType<signed long long>(IntComparableWith<signed long long>(10));
testType<unsigned long long>(IntComparableWith<unsigned long long>(10));
testType<signed long>(IntComparableWith<signed long>(10));
testType<unsigned long>(IntComparableWith<unsigned long>(10));
testType<int>(IntComparableWith<int>(10));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,11 @@ void test() {
// Same as below, if there is no type larger than long, we can just use that.
static_assert(sizeof(Iter::difference_type) >= sizeof(long));
static_assert(std::is_signed_v<Iter::difference_type>);
#ifdef TEST_HAS_NO_INT128
LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, long long>);
#else
LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, __int128_t>);
#endif
}
{
const std::ranges::iota_view<long long> io(0);
Expand All @@ -118,7 +122,11 @@ void test() {
// https://eel.is/c++draft/range.iota.view#1.3
static_assert(sizeof(Iter::difference_type) >= sizeof(long long));
static_assert(std::is_signed_v<Iter::difference_type>);
#ifdef TEST_HAS_NO_INT128
LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, long long>);
#else
LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, __int128_t>);
#endif
}
{
const std::ranges::iota_view<Decrementable> io;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ constexpr void testType() {
constexpr bool test() {
testType<SomeInt>();
testType<NotNoexceptCopy>();
#ifndef TEST_HAS_NO_INT128
testType<__int128_t>();
testType<__uint128_t>();
#endif
testType<signed long long>();
testType<unsigned long long>();
testType<signed long>();
testType<unsigned long>();
testType<int>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ constexpr void testType() {

constexpr bool test() {
testType<SomeInt>();
#ifndef TEST_HAS_NO_INT128
testType<__int128_t>();
testType<__uint128_t>();
#endif
testType<signed long long>();
testType<unsigned long long>();
testType<signed long>();
testType<unsigned long>();
testType<int>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,21 @@
#include <ranges>

#include "test_macros.h"
#include "type_algorithms.h"
#include "types.h"

template <typename T>
concept HasSize = requires(const T t) { t.size(); };

struct CheckForSize {
template <class IntegerLikeT>
constexpr void operator()() {
types::for_each(types::integer_types{}, []<typename BoundT>() {
static_assert(HasSize<std::ranges::iota_view<IntegerLikeT, BoundT>>);
});
}
};

constexpr bool test() {
// Both are integer like and both are less than zero.
{
Expand Down Expand Up @@ -99,6 +112,11 @@ constexpr bool test() {
assert(sz == 10);
}

// LWG3610: `iota_view::size` sometimes rejects integer-class types
{
types::for_each(types::integer_types{}, CheckForSize{});
}

return true;
}

Expand Down
Loading