1330d8983SJohannes Doerfert // RUN: %libomptarget-compilexx-run-and-check-aarch64-unknown-linux-gnu 2330d8983SJohannes Doerfert // RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu 3330d8983SJohannes Doerfert // RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu 4*1a0cf245SJan Patrick Lehr // RUN: %libomptarget-compilexx-run-and-check-x86_64-unknown-linux-gnu 5330d8983SJohannes Doerfert // RUN: %libomptarget-compilexx-run-and-check-nvptx64-nvidia-cuda 6330d8983SJohannes Doerfert 7330d8983SJohannes Doerfert #include <cstdio> 8330d8983SJohannes Doerfert #include <cstdlib> 9330d8983SJohannes Doerfert 10330d8983SJohannes Doerfert typedef struct { 11330d8983SJohannes Doerfert int a; 12330d8983SJohannes Doerfert double *b; 13330d8983SJohannes Doerfert } C1; 14330d8983SJohannes Doerfert #pragma omp declare mapper(C1 s) map(to : s.a) map(from : s.b[0 : 2]) 15330d8983SJohannes Doerfert 16330d8983SJohannes Doerfert typedef struct { 17330d8983SJohannes Doerfert int a; 18330d8983SJohannes Doerfert double *b; 19330d8983SJohannes Doerfert C1 c; 20330d8983SJohannes Doerfert } C; 21330d8983SJohannes Doerfert #pragma omp declare mapper(C s) map(to : s.a, s.c) map(from : s.b[0 : 2]) 22330d8983SJohannes Doerfert 23330d8983SJohannes Doerfert typedef struct { 24330d8983SJohannes Doerfert int e; 25330d8983SJohannes Doerfert C f; 26330d8983SJohannes Doerfert int h; 27330d8983SJohannes Doerfert } D; 28330d8983SJohannes Doerfert 29330d8983SJohannes Doerfert int main() { 30330d8983SJohannes Doerfert constexpr int N = 10; 31330d8983SJohannes Doerfert D sa[10]; 32330d8983SJohannes Doerfert sa[1].e = 111; 33330d8983SJohannes Doerfert sa[1].f.a = 222; 34330d8983SJohannes Doerfert sa[1].f.c.a = 777; 35330d8983SJohannes Doerfert double x[2]; 36330d8983SJohannes Doerfert double x1[2]; 37330d8983SJohannes Doerfert x[1] = 20; 38330d8983SJohannes Doerfert sa[1].f.b = &x[0]; 39330d8983SJohannes Doerfert sa[1].f.c.b = &x1[0]; 40330d8983SJohannes Doerfert sa[1].h = N; 41330d8983SJohannes Doerfert 42330d8983SJohannes Doerfert printf("%d %d %d %4.5f %d\n", sa[1].e, sa[1].f.a, sa[1].f.c.a, sa[1].f.b[1], 43330d8983SJohannes Doerfert sa[1].f.b == &x[0] ? 1 : 0); 44330d8983SJohannes Doerfert // CHECK: 111 222 777 20.00000 1 45330d8983SJohannes Doerfert 46330d8983SJohannes Doerfert __intptr_t p = reinterpret_cast<__intptr_t>(&x[0]); 47330d8983SJohannes Doerfert #pragma omp target map(tofrom : sa[1]) firstprivate(p) 48330d8983SJohannes Doerfert { 49330d8983SJohannes Doerfert printf("%d %d %d\n", sa[1].f.a, sa[1].f.c.a, 50330d8983SJohannes Doerfert sa[1].f.b == reinterpret_cast<void *>(p) ? 1 : 0); 51330d8983SJohannes Doerfert // CHECK: 222 777 0 52330d8983SJohannes Doerfert sa[1].e = 333; 53330d8983SJohannes Doerfert sa[1].f.a = 444; 54330d8983SJohannes Doerfert sa[1].f.c.a = 555; 55330d8983SJohannes Doerfert sa[1].f.b[1] = 40; 56330d8983SJohannes Doerfert } 57330d8983SJohannes Doerfert printf("%d %d %d %4.5f %d\n", sa[1].e, sa[1].f.a, sa[1].f.c.a, sa[1].f.b[1], 58330d8983SJohannes Doerfert sa[1].f.b == &x[0] ? 1 : 0); 59330d8983SJohannes Doerfert // CHECK: 333 222 777 40.00000 1 60330d8983SJohannes Doerfert } 61