1 // RUN: %libomptarget-compilexx-run-and-check-generic
2 
3 // amdgcn does not have printf definition
4 // XFAIL: amdgcn-amd-amdhsa
5 
6 #include <cstdio>
7 #include <cstdlib>
8 
9 typedef struct {
10   int a;
11   double *b;
12 } C1;
13 #pragma omp declare mapper(C1 s) map(to : s.a) map(from : s.b [0:2])
14 
15 typedef struct {
16   int a;
17   double *b;
18   C1 c;
19 } C;
20 #pragma omp declare mapper(C s) map(to : s.a, s.c) map(from : s.b [0:2])
21 
22 typedef struct {
23   int e;
24   C f;
25   int h;
26 } D;
27 
28 int main() {
29   constexpr int N = 10;
30   D s;
31   s.e = 111;
32   s.f.a = 222;
33   s.f.c.a = 777;
34   double x[2];
35   double x1[2];
36   x[1] = 20;
37   s.f.b = &x[0];
38   s.f.c.b = &x1[0];
39   s.h = N;
40 
41   D *sp = &s;
42   D **spp = &sp;
43 
44   printf("%d %d %d %4.5f %d\n", spp[0][0].e, spp[0][0].f.a, spp[0][0].f.c.a,
45          spp[0][0].f.b[1], spp[0][0].f.b == &x[0] ? 1 : 0);
46   // CHECK: 111 222 777 20.00000 1
47 
48   __intptr_t p = reinterpret_cast<__intptr_t>(&x[0]);
49 #pragma omp target map(tofrom : spp[0][0]) firstprivate(p)
50   {
51     printf("%d %d %d\n", spp[0][0].f.a, spp[0][0].f.c.a,
52            spp[0][0].f.b == reinterpret_cast<void *>(p) ? 1 : 0);
53     // CHECK: 222 777 0
54     spp[0][0].e = 333;
55     spp[0][0].f.a = 444;
56     spp[0][0].f.c.a = 555;
57     spp[0][0].f.b[1] = 40;
58   }
59   printf("%d %d %d %4.5f %d\n", spp[0][0].e, spp[0][0].f.a, spp[0][0].f.c.a,
60          spp[0][0].f.b[1], spp[0][0].f.b == &x[0] ? 1 : 0);
61   // CHECK: 333 222 777 40.00000 1
62 }
63