/* { dg-additional-options -std=c++23 } */ /* numerics */ #include #include #include #include #include //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping" #pragma omp declare target(std::ranges::all_of, std::ranges::iota) #include "target-flex-common.h" namespace stdr = std::ranges; bool test(std::size_t arg) { bool ok; int midpoint_out; std::vector vec(arg); int *data = vec.data(); std::size_t size = vec.size(); #pragma omp target defaultmap(none) map(from: ok, midpoint_out) map(tofrom: data[:size]) map(to: arg, size) { std::span span = {data, size}; bool inner_ok = true; { VERIFY (stdr::all_of(span, [](int v){ return v == int{}; })); stdr::iota(span, 0); midpoint_out = *std::midpoint(span.data(), span.data() + span.size()); } end: ok = inner_ok; } if (!ok) return false; VERIFY_NON_TARGET (stdr::equal(vec, std::views::iota(0, static_cast(vec.size())))); VERIFY_NON_TARGET (*std::midpoint(vec.data(), vec.data() + vec.size()) == midpoint_out); return true; } int main() { volatile std::size_t arg = 42; return test(arg) ? 0 : 1; }