/* { dg-additional-options -std=c++23 } */ /* std::views stuff. Also tests std::tuple with std::views::zip. */ #include #include #include //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping" #pragma omp declare target(std::ranges::all_of, std::ranges::equal, std::ranges::fold_left, std::views::reverse, std::views::zip) #include "target-flex-common.h" namespace stdr = std::ranges; namespace stdv = std::views; bool f() { const int arr_fwd[8] = {0, 1, 2, 3, 4, 5, 6, 7}; const int arr_rev[8] = {7, 6, 5, 4, 3, 2, 1, 0}; bool ok; #pragma omp target defaultmap(none) map(from: ok) map(to: arr_fwd[:8], arr_rev[:8]) { std::span fwd = {arr_fwd, 8}; std::span rev = {arr_rev, 8}; bool inner_ok = true; { VERIFY(stdr::equal(fwd, rev | stdv::reverse)); VERIFY(stdr::equal(fwd | stdv::drop(4) | stdv::reverse, rev | stdv::take(4))); for (auto [first, second] : stdv::zip(fwd, rev)) VERIFY(first + second == 7); auto plus = [](int a, int b){ return a + b; }; auto is_even = [](int v){ return v % 2 == 0; }; VERIFY(stdr::fold_left(fwd | stdv::filter(is_even), 0, plus) == 12); VERIFY(stdr::all_of(fwd | stdv::transform([](int v){ return v * 2; }), is_even)); } end: ok = inner_ok; } return ok; } int main() { return f() ? 0 : 1; }