[libcxx-commits] [libcxx] ad31e11 - [libc++] Make views::iota aware of __int128 (#167869)
via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Nov 19 06:19:58 PST 2025
Author: Nikolas Klauser
Date: 2025-11-19T15:19:54+01:00
New Revision: ad31e11ab6d719d803708169a981a49b347c4d82
URL: https://github.com/llvm/llvm-project/commit/ad31e11ab6d719d803708169a981a49b347c4d82
DIFF: https://github.com/llvm/llvm-project/commit/ad31e11ab6d719d803708169a981a49b347c4d82.diff
LOG: [libc++] Make views::iota aware of __int128 (#167869)
Fixes #167991
Added:
Modified:
libcxx/docs/ReleaseNotes/22.rst
libcxx/include/__ranges/iota_view.h
libcxx/test/std/ranges/range.factories/range.iota.view/indices.pass.cpp
libcxx/test/std/ranges/range.factories/range.iota.view/iterator/member_typedefs.compile.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 2c19dfc57a3f8..7af1351e8cee6 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -114,5 +114,8 @@ ABI Affecting Changes
potentially inheriting from the types they wrap. At this point in time we are not aware of any ABI changes caused by
this.
+- ``ranges::iota_view`` is now aware of ``__int128``. This causes ``iota_view::
diff erence_type`` to change from
+ ``long long`` to ``__int128`` in some cases.
+
Build System Changes
--------------------
diff --git a/libcxx/include/__ranges/iota_view.h b/libcxx/include/__ranges/iota_view.h
index 22adc22e69190..f66f3f9183fc7 100644
--- a/libcxx/include/__ranges/iota_view.h
+++ b/libcxx/include/__ranges/iota_view.h
@@ -58,11 +58,17 @@ struct __get_wider_signed {
return type_identity<int>{};
else if constexpr (sizeof(_Int) < sizeof(long))
return type_identity<long>{};
- else
+ else if constexpr (sizeof(_Int) < sizeof(long long))
return type_identity<long long>{};
-
- static_assert(
- sizeof(_Int) <= sizeof(long long), "Found integer-like type that is bigger than largest integer like type.");
+# if _LIBCPP_HAS_INT128
+ else if constexpr (sizeof(_Int) <= sizeof(__int128))
+ return type_identity<__int128>{};
+# else
+ else if constexpr (sizeof(_Int) <= sizeof(long long))
+ return type_identity<long long>{};
+# endif
+ else
+ static_assert(false, "Found integer-like type that is bigger than the largest integer like type.");
}
using type = typename decltype(__call())::type;
diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/indices.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/indices.pass.cpp
index b70471b25d32b..872308594ba06 100644
--- a/libcxx/test/std/ranges/range.factories/range.iota.view/indices.pass.cpp
+++ b/libcxx/test/std/ranges/range.factories/range.iota.view/indices.pass.cpp
@@ -21,7 +21,6 @@
#include <vector>
#include "test_macros.h"
-#define TEST_HAS_NO_INT128 // Size cannot be larger than 64 bits
#include "type_algorithms.h"
#include "types.h"
diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/member_typedefs.compile.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/member_typedefs.compile.pass.cpp
index c2f7fd14042a8..0d6fc9cd748b3 100644
--- a/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/member_typedefs.compile.pass.cpp
+++ b/libcxx/test/std/ranges/range.factories/range.iota.view/iterator/member_typedefs.compile.pass.cpp
@@ -106,7 +106,12 @@ void test() {
// Same as below, if there is no type larger than long, we can just use that.
static_assert(sizeof(Iter::
diff erence_type) >= sizeof(long));
static_assert(std::is_signed_v<Iter::
diff erence_type>);
+#ifdef TEST_HAS_NO_INT128
LIBCPP_STATIC_ASSERT(std::same_as<Iter::
diff erence_type, long long>);
+#else
+ LIBCPP_STATIC_ASSERT(std::same_as<Iter::
diff erence_type,
+ std::conditional_t<sizeof(long) == sizeof(long long), __int128, long long>>);
+#endif
}
{
const std::ranges::iota_view<long long> io(0);
@@ -118,7 +123,11 @@ void test() {
// https://eel.is/c++draft/range.iota.view#1.3
static_assert(sizeof(Iter::
diff erence_type) >= sizeof(long long));
static_assert(std::is_signed_v<Iter::
diff erence_type>);
+#ifdef TEST_HAS_NO_INT128
LIBCPP_STATIC_ASSERT(std::same_as<Iter::
diff erence_type, long long>);
+#else
+ LIBCPP_STATIC_ASSERT(std::same_as<Iter::
diff erence_type, __int128>);
+#endif
}
{
const std::ranges::iota_view<Decrementable> io;
More information about the libcxx-commits
mailing list