/* { dg-additional-options "-std=c++20" } */ /* ranged algorithms c++20 */ #include #include #include //TODO PR120454 "C++ constexpr vs. OpenMP implicit mapping" #pragma omp declare target(std::ranges::copy, std::ranges::equal, std::ranges::rotate, std::ranges::transform) #include "target-flex-common.h" namespace stdr = std::ranges; template bool test(const T (&arr)[Size]) { bool ok; T out_2x_arr[Size]; T out_shifted_arr[Size]; #pragma omp target defaultmap(none) \ map(from: ok, out_2x_arr[:Size], out_shifted_arr[:Size]) \ map(to: arr[:Size]) { std::vector vec(Size); std::vector mutated(Size); bool inner_ok = true; { stdr::copy(arr, vec.begin()); VERIFY (stdr::equal(arr, vec)); stdr::transform(vec, mutated.begin(), [](const T& v){ return v * 2; }); stdr::copy(mutated, out_2x_arr); stdr::rotate(vec, std::next(vec.begin(), Size / 2)); stdr::copy(vec, out_shifted_arr); } end: ok = inner_ok; } if (!ok) return false; VERIFY_NON_TARGET (stdr::equal(arr, out_2x_arr, stdr::equal_to{}, [](const T& v){ return v * 2; })); std::vector shifted(arr, arr + Size); stdr::rotate(shifted, std::next(shifted.begin(), Size / 2)); VERIFY_NON_TARGET (stdr::equal(out_shifted_arr, shifted)); return true; } int main() { int arr[] = {0, 1, 2, 3, 4, 5, 6, 7}; return test(arr) ? 0 : 1; }