Skip to content

Conversation

@philnik777
Copy link
Contributor

@philnik777 philnik777 commented Nov 13, 2025

Fixes #167991

@github-actions
Copy link

github-actions bot commented Nov 13, 2025

✅ With the latest revision this PR passed the C/C++ code formatter.

@ldionne ldionne marked this pull request as ready for review November 17, 2025 15:44
@ldionne ldionne requested a review from a team as a code owner November 17, 2025 15:44
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Nov 17, 2025
@llvmbot
Copy link
Member

llvmbot commented Nov 17, 2025

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

Changes

Fixes #167991


Full diff: https://github.com/llvm/llvm-project/pull/167869.diff

3 Files Affected:

  • (modified) libcxx/include/__ranges/iota_view.h (+10-4)
  • (modified) libcxx/test/std/ranges/range.factories/range.iota.view/indices.pass.cpp (-1)
  • (modified) libcxx/test/std/ranges/range.factories/range.iota.view/iterator/member_typedefs.compile.pass.cpp (+9)
diff --git a/libcxx/include/__ranges/iota_view.h b/libcxx/include/__ranges/iota_view.h
index 22adc22e69190..d91c365233215 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 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..d1b97cf889a42 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::difference_type) >= sizeof(long));
     static_assert(std::is_signed_v<Iter::difference_type>);
+#if !defined(TEST_HAS_NO_INT128)
+    LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type,
+                                      std::conditional_t<sizeof(long) == sizeof(long long), __int128, long long>>);
+#else
     LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, 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::difference_type) >= sizeof(long long));
     static_assert(std::is_signed_v<Iter::difference_type>);
+#ifndef TEST_HAS_NO_INT128
+    LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, __int128>);
+#else
     LIBCPP_STATIC_ASSERT(std::same_as<Iter::difference_type, long long>);
+#endif
   }
   {
     const std::ranges::iota_view<Decrementable> io;

@philnik777 philnik777 merged commit ad31e11 into llvm:main Nov 19, 2025
78 of 81 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[libc++] iota_view should support int128_t

3 participants