From 6ecbea40195c91ce7b723f1f2514cbbfaea11b78 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 7 Dec 2023 22:10:42 -0800 Subject: [PATCH 1/2] Fix range.split/adaptor.pass.cpp; only views::split('x') can be piped. This was failing with: D:\GitHub\STL\llvm-project\libcxx\test\std\ranges\range.adaptors\range.split\adaptor.pass.cpp(42,1): error: static assertion failed static_assert( CanBePiped); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ D:\GitHub\STL\llvm-project\libcxx\test\std\ranges\range.adaptors\range.split\adaptor.pass.cpp(42,16): note: because 'CanBePiped' evaluated to false static_assert( CanBePiped); ^ D:\GitHub\STL\llvm-project\libcxx\test\std\ranges\range.adaptors\range.split\adaptor.pass.cpp(25,30): note: because 'std::forward(view) | std::forward(t)' would be invalid: invalid operands to binary expression ('SomeView' and 'const std::ranges::views::_Split_fn') { std::forward(view) | std::forward(t) }; ^ D:\GitHub\STL\llvm-project\libcxx\test\std\ranges\range.adaptors\range.split\adaptor.pass.cpp(43,1): error: static assertion failed static_assert( CanBePiped); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ D:\GitHub\STL\llvm-project\libcxx\test\std\ranges\range.adaptors\range.split\adaptor.pass.cpp(43,16): note: because 'CanBePiped' evaluated to false static_assert( CanBePiped); ^ D:\GitHub\STL\llvm-project\libcxx\test\std\ranges\range.adaptors\range.split\adaptor.pass.cpp(25,30): note: because 'std::forward(view) | std::forward(t)' would be invalid: invalid operands to binary expression ('char[10]' and 'const std::ranges::views::_Split_fn') { std::forward(view) | std::forward(t) }; ^ Similarly for range.lazy.split/adaptor.pass.cpp. --- .../range.adaptors/range.lazy.split/adaptor.pass.cpp | 8 ++++---- .../ranges/range.adaptors/range.split/adaptor.pass.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp index da4bd9fbbe179..aae5b6e54f648 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp @@ -40,10 +40,10 @@ static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); -static_assert( CanBePiped); -static_assert( CanBePiped); -static_assert(!CanBePiped); -static_assert(!CanBePiped); +static_assert(CanBePiped); +static_assert(CanBePiped); +static_assert(!CanBePiped); +static_assert(!CanBePiped); static_assert(std::same_as); diff --git a/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp index cd12011daeab5..5bf2d56090e8f 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp @@ -39,10 +39,10 @@ static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); -static_assert( CanBePiped); -static_assert( CanBePiped); -static_assert(!CanBePiped); -static_assert(!CanBePiped); +static_assert(CanBePiped); +static_assert(CanBePiped); +static_assert(!CanBePiped); +static_assert(!CanBePiped); static_assert(std::same_as); From 97c2ccea21c776aeca56d52d5a9b5e5e59160c03 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 12 Dec 2023 16:55:21 -0800 Subject: [PATCH 2/2] Fix product code, add regression test. --- libcxx/include/__ranges/lazy_split_view.h | 2 +- libcxx/include/__ranges/split_view.h | 2 +- .../ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp | 6 ++++++ .../std/ranges/range.adaptors/range.split/adaptor.pass.cpp | 6 ++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libcxx/include/__ranges/lazy_split_view.h b/libcxx/include/__ranges/lazy_split_view.h index 2c654bfd325a6..8ed4bcfdeb56d 100644 --- a/libcxx/include/__ranges/lazy_split_view.h +++ b/libcxx/include/__ranges/lazy_split_view.h @@ -437,7 +437,7 @@ lazy_split_view(_Range&&, range_value_t<_Range>) namespace views { namespace __lazy_split_view { -struct __fn : __range_adaptor_closure<__fn> { +struct __fn { template [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range, _Pattern&& __pattern) const diff --git a/libcxx/include/__ranges/split_view.h b/libcxx/include/__ranges/split_view.h index a27ac4ef7a196..7f03be3c346a4 100644 --- a/libcxx/include/__ranges/split_view.h +++ b/libcxx/include/__ranges/split_view.h @@ -194,7 +194,7 @@ struct split_view<_View, _Pattern>::__sentinel { namespace views { namespace __split_view { -struct __fn : __range_adaptor_closure<__fn> { +struct __fn { // clang-format off template _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI diff --git a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp index aae5b6e54f648..6bfa0ab487ba1 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/adaptor.pass.cpp @@ -40,6 +40,12 @@ static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); +// Regression test for #75002, views::lazy_split shouldn't be a range adaptor closure +static_assert(!CanBePiped); +static_assert(!CanBePiped); +static_assert(!CanBePiped); +static_assert(!CanBePiped); + static_assert(CanBePiped); static_assert(CanBePiped); static_assert(!CanBePiped); diff --git a/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp index 5bf2d56090e8f..85d13ac5c29df 100644 --- a/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.split/adaptor.pass.cpp @@ -39,6 +39,12 @@ static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); +// Regression test for #75002, views::split shouldn't be a range adaptor closure +static_assert(!CanBePiped); +static_assert(!CanBePiped); +static_assert(!CanBePiped); +static_assert(!CanBePiped); + static_assert(CanBePiped); static_assert(CanBePiped); static_assert(!CanBePiped);