1 // RUN: %libomptarget-compilexx-and-run-generic
2 
3 #include <cassert>
4 #include <iostream>
5 
6 constexpr const int N = 10;
7 
8 struct T {
9   int a;
10   int *p;
11 };
12 
13 struct S {
14   int b;
15   T t;
16 };
17 
main(int argc,char * argv[])18 int main(int argc, char *argv[]) {
19   S s;
20   s.t.p = new int[N];
21   for (int i = 0; i < N; ++i) {
22     s.t.p[i] = i;
23   }
24 
25 #pragma omp target enter data map(to : s, s.t.p[:N])
26 
27 #pragma omp target
28   {
29     for (int i = 0; i < N; ++i) {
30       s.t.p[i] += i;
31     }
32   }
33 
34 #pragma omp target update from(s.t.p[:N])
35 
36   for (int i = 0; i < N; ++i) {
37     assert(s.t.p[i] == 2 * i);
38     s.t.p[i] += i;
39   }
40 
41 #pragma omp target update to(s.t.p[:N])
42 
43 #pragma omp target
44   {
45     for (int i = 0; i < N; ++i) {
46       s.t.p[i] += i;
47     }
48   }
49 
50 #pragma omp target exit data map(from : s, s.t.p[:N])
51 
52   for (int i = 0; i < N; ++i) {
53     assert(s.t.p[i] == 4 * i);
54   }
55 
56   return 0;
57 }
58