diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv index 5460664369793..082a86a65c852 100644 --- a/libcxx/docs/Status/Cxx2cIssues.csv +++ b/libcxx/docs/Status/Cxx2cIssues.csv @@ -71,7 +71,7 @@ "`LWG4079 `__","Missing Preconditions in ``concat_view::iterator``\`s conversion constructor","2024-06 (St. Louis)","","","" "`LWG4082 `__","``views::concat(r)`` is well-formed when ``r`` is an ``output_range``","2024-06 (St. Louis)","","","" "`LWG4083 `__","``views::as_rvalue`` should reject non-input ranges","2024-06 (St. Louis)","","","" -"`LWG4096 `__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","","","" +"`LWG4096 `__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","|Complete|","22","" "`LWG4098 `__","``views::adjacent<0>`` should reject non-forward ranges","2024-06 (St. Louis)","","","" "`LWG4105 `__","``ranges::ends_with``\`s Returns misses difference casting","2024-06 (St. Louis)","","","" "`LWG4106 `__","``basic_format_args`` should not be default-constructible","2024-06 (St. Louis)","|Complete|","19","" diff --git a/libcxx/include/__ranges/iota_view.h b/libcxx/include/__ranges/iota_view.h index 4b84585258b91..32ff3408e54ea 100644 --- a/libcxx/include/__ranges/iota_view.h +++ b/libcxx/include/__ranges/iota_view.h @@ -30,6 +30,7 @@ #include <__ranges/movable_box.h> #include <__ranges/view_interface.h> #include <__type_traits/conditional.h> +#include <__type_traits/decay.h> #include <__type_traits/is_nothrow_constructible.h> #include <__type_traits/make_unsigned.h> #include <__type_traits/type_identity.h> @@ -374,10 +375,10 @@ namespace views { namespace __iota { struct __fn { template + requires(requires(_Start __s) { ranges::iota_view>(std::forward<_Start>(__s)); }) _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Start&& __start) const - noexcept(noexcept(ranges::iota_view(std::forward<_Start>(__start)))) - -> decltype(ranges::iota_view(std::forward<_Start>(__start))) { - return ranges::iota_view(std::forward<_Start>(__start)); + noexcept(noexcept(ranges::iota_view>(std::forward<_Start>(__start)))) { + return ranges::iota_view>(std::forward<_Start>(__start)); } template diff --git a/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.pass.cpp b/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.pass.cpp index a6b268fd6a8d8..4f06b260d0d23 100644 --- a/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.pass.cpp +++ b/libcxx/test/std/ranges/range.factories/range.iota.view/views_iota.pass.cpp @@ -46,6 +46,9 @@ constexpr void testType(U u) { struct X {}; +template +concept CanDoubleWrap = requires(IntT i) { std::views::iota(std::views::iota(i)); }; + constexpr bool test() { testType(SomeInt(10)); testType(IntComparableWith(SomeInt(10))); @@ -68,6 +71,15 @@ constexpr bool test() { { static_assert(std::same_as); } + { // LWG4096: views::iota(views::iota(0)) should be rejected + static_assert(!CanDoubleWrap); + static_assert(!CanDoubleWrap); + + static_assert(!std::is_invocable_v); + static_assert(!std::is_invocable_v); + static_assert(!std::is_invocable_v); + static_assert(!std::is_invocable_v); + } return true; }