// RUN: %libomptarget-compilexx-and-run-generic // RUN: %libomptarget-compileoptxx-and-run-generic #include #include constexpr const int N = 10; struct T { int a; int *p; }; struct S { int b; T t; }; int main(int argc, char *argv[]) { S s; s.t.p = new int[N]; for (int i = 0; i < N; ++i) { s.t.p[i] = i; } #pragma omp target enter data map(to : s, s.t.p[ : N]) #pragma omp target { for (int i = 0; i < N; ++i) { s.t.p[i] += i; } } #pragma omp target update from(s.t.p[ : N]) for (int i = 0; i < N; ++i) { assert(s.t.p[i] == 2 * i); s.t.p[i] += i; } #pragma omp target update to(s.t.p[ : N]) #pragma omp target { for (int i = 0; i < N; ++i) { s.t.p[i] += i; } } #pragma omp target exit data map(from : s, s.t.p[ : N]) for (int i = 0; i < N; ++i) { assert(s.t.p[i] == 4 * i); } return 0; }