Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)","","","`#104945 <https://github.com/llvm/llvm-project/issues/104945>`__",""
"`LWG3601 <https://wg21.link/LWG3601>`__","common_iterator's postfix-proxy needs ``indirectly_readable`` ","2022-02 (Virtual)","","","`#104946 <https://github.com/llvm/llvm-project/issues/104946>`__",""
"`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|","","`#104947 <https://github.com/llvm/llvm-project/issues/104947>`__",""
"`LWG3610 <https://wg21.link/LWG3610>`__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","","","`#104948 <https://github.com/llvm/llvm-project/issues/104948>`__",""
"`LWG3610 <https://wg21.link/LWG3610>`__","``iota_view::size`` sometimes rejects integer-class types","2022-02 (Virtual)","|Complete|","22","`#104948 <https://github.com/llvm/llvm-project/issues/104948>`__",""
"`LWG3612 <https://wg21.link/LWG3612>`__","Inconsistent pointer alignment in ``std::format`` ","2022-02 (Virtual)","|Complete|","14","`#104949 <https://github.com/llvm/llvm-project/issues/104949>`__",""
"`LWG3616 <https://wg21.link/LWG3616>`__","LWG 3498 seems to miss the non-member ``swap`` for ``basic_syncbuf`` ","2022-02 (Virtual)","|Complete|","18","`#104950 <https://github.com/llvm/llvm-project/issues/104950>`__",""
"`LWG3618 <https://wg21.link/LWG3618>`__","Unnecessary ``iter_move`` for ``transform_view::iterator`` ","2022-02 (Virtual)","|Complete|","19","`#104951 <https://github.com/llvm/llvm-project/issues/104951>`__",""
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