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