blob: 6221f071331212275af7996e63691b40cb67d98f [file] [log] [blame]
// { dg-options "-std=gnu++23" }
// { dg-do run { target c++23 } }
#include <ranges>
#include <algorithm>
#include <testsuite_hooks.h>
namespace ranges = std::ranges;
namespace views = std::views;
struct _Negate : ranges::range_adaptor_closure<_Negate>
{
template<ranges::viewable_range _Range>
constexpr auto
operator()(_Range&& __r) const
requires requires { views::transform(std::declval<_Range>(), std::negate{}); }
{ return views::transform(std::forward<_Range>(__r), std::negate{}); }
};
constexpr _Negate negate;
constexpr bool
test01()
{
int x[] = {1, 2, 3};
VERIFY( ranges::equal(x | negate, (int[]){-1, -2, -3}) );
VERIFY( ranges::equal(x | negate | negate, x) );
VERIFY( ranges::equal(x | (negate | negate), x) );
VERIFY( ranges::equal(x | views::reverse | negate, x | negate | views::reverse) );
VERIFY( ranges::equal(x | (views::reverse | negate), x | (negate | views::reverse)) );
#if 0
// These asserts currently fail for the same reason as the disabled asserts
// in std/ranges/adaptors/all.cc.
static_assert( sizeof(negate | views::reverse | views::join) == 1 );
static_assert( sizeof(views::reverse | negate | views::join) == 1 );
static_assert( sizeof(views::reverse | views::join | negate) == 1 );
#endif
return true;
}
int
main()
{
static_assert(test01());
}