diff --git a/libcxx/docs/Status/Cxx2bIssues.csv b/libcxx/docs/Status/Cxx2bIssues.csv index 756c6869fed24d..c648938ac397d2 100644 --- a/libcxx/docs/Status/Cxx2bIssues.csv +++ b/libcxx/docs/Status/Cxx2bIssues.csv @@ -186,6 +186,8 @@ "`3721 `__","Allow an ``arg-id`` with a value of zero for ``width`` in ``std-format-spec``","July 2022","|Complete|","16.0","|format|" "`3724 `__","``decay-copy`` should be constrained","July 2022","|Complete|","14.0" "","","","","" +"`3646 `__","``std::ranges::view_interface::size`` returns a signed type","November 2022","|Complete|","16.0" +"","","","","" "`3629 `__","``make_error_code`` and ``make_error_condition`` are customization points","Not voted in","|Complete|","16.0","" "`3631 `__","``basic_format_arg(T&&)`` should use ``remove_cvref_t`` throughout","Not voted in","|Complete|","15.0","" "`3645 `__","``resize_and_overwrite`` is overspecified to call its callback with lvalues","Not voted in","|Complete|","14.0","" diff --git a/libcxx/include/__ranges/view_interface.h b/libcxx/include/__ranges/view_interface.h index b89ee999f8cc9e..b706c8d2580a58 100644 --- a/libcxx/include/__ranges/view_interface.h +++ b/libcxx/include/__ranges/view_interface.h @@ -100,7 +100,7 @@ class view_interface { constexpr auto size() requires forward_range<_D2> && sized_sentinel_for, iterator_t<_D2>> { - return ranges::end(__derived()) - ranges::begin(__derived()); + return std::__to_unsigned_like(ranges::end(__derived()) - ranges::begin(__derived())); } template @@ -108,7 +108,7 @@ class view_interface { constexpr auto size() const requires forward_range && sized_sentinel_for, iterator_t> { - return ranges::end(__derived()) - ranges::begin(__derived()); + return std::__to_unsigned_like(ranges::end(__derived()) - ranges::begin(__derived())); } template diff --git a/libcxx/test/std/ranges/range.utility/view.interface/view.interface.pass.cpp b/libcxx/test/std/ranges/range.utility/view.interface/view.interface.pass.cpp index 2c1c504a001702..830f3f77c29ec3 100644 --- a/libcxx/test/std/ranges/range.utility/view.interface/view.interface.pass.cpp +++ b/libcxx/test/std/ranges/range.utility/view.interface/view.interface.pass.cpp @@ -233,12 +233,18 @@ constexpr bool testSize() { static_assert(!SizeInvocable); static_assert( SizeInvocable); + using SignedSize = std::common_type_t>; ForwardRange forwardRange; assert(forwardRange.size() == 8); assert(static_cast(forwardRange).size() == 8); assert(std::ranges::size(forwardRange) == 8); + static_assert(std::same_as())), std::size_t>); + static_assert(std::same_as())), SignedSize>); + assert(std::ranges::size(static_cast(forwardRange)) == 8); + static_assert(std::same_as())), std::size_t>); + static_assert(std::same_as())), SignedSize>); SizeIsTen sizeTen; assert(sizeTen.size() == 10);