diff --git a/libcxx/include/__ranges/iota_view.h b/libcxx/include/__ranges/iota_view.h index f372688abfdaf..ccf0c7a8e8d50 100644 --- a/libcxx/include/__ranges/iota_view.h +++ b/libcxx/include/__ranges/iota_view.h @@ -363,15 +363,14 @@ namespace ranges { (integral<_Start> && integral<_BoundSentinel>) || sized_sentinel_for<_BoundSentinel, _Start> { if constexpr (__integer_like<_Start> && __integer_like<_BoundSentinel>) { - if (__value_ < 0) { - if (__bound_sentinel_ < 0) { - return std::__to_unsigned_like(-__value_) - std::__to_unsigned_like(-__bound_sentinel_); - } - return std::__to_unsigned_like(__bound_sentinel_) + std::__to_unsigned_like(-__value_); - } - return std::__to_unsigned_like(__bound_sentinel_) - std::__to_unsigned_like(__value_); + return (__value_ < 0) + ? ((__bound_sentinel_ < 0) + ? std::__to_unsigned_like(-__value_) - std::__to_unsigned_like(-__bound_sentinel_) + : std::__to_unsigned_like(__bound_sentinel_) + std::__to_unsigned_like(-__value_)) + : std::__to_unsigned_like(__bound_sentinel_) - std::__to_unsigned_like(__value_); + } else { + return std::__to_unsigned_like(__bound_sentinel_ - __value_); } - return std::__to_unsigned_like(__bound_sentinel_ - __value_); } }; 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 07092b74be873..b894bc542be10 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 @@ -10,9 +10,10 @@ // constexpr auto size() const requires see below; -#include #include +#include #include +#include #include "test_macros.h" #include "types.h" @@ -89,6 +90,15 @@ constexpr bool test() { assert(io.size() == 0); } + // Make sure iota_view works properly. For details, + // see https://github.com/llvm/llvm-project/issues/67551. + { + static_assert(std::ranges::sized_range>); + std::ranges::iota_view io(10, 20); + std::same_as auto sz = io.size(); + assert(sz == 10); + } + return true; }