107988422SAlexey Bataev // RUN: %libomptarget-compilexx-run-and-check-aarch64-unknown-linux-gnu
207988422SAlexey Bataev // RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu
307988422SAlexey Bataev // RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu
407988422SAlexey Bataev // RUN: %libomptarget-compilexx-run-and-check-x86_64-pc-linux-gnu
507988422SAlexey Bataev // RUN: %libomptarget-compilexx-run-and-check-nvptx64-nvidia-cuda
607988422SAlexey Bataev
7*ca705120SAlexey Bataev // UNSUPPORTED: clang
807988422SAlexey Bataev
907988422SAlexey Bataev #include <cstdio>
1007988422SAlexey Bataev #include <cstdlib>
1107988422SAlexey Bataev
1207988422SAlexey Bataev typedef struct {
1307988422SAlexey Bataev int a;
1407988422SAlexey Bataev double *b;
1507988422SAlexey Bataev } C1;
1607988422SAlexey Bataev #pragma omp declare mapper(C1 s) map(to : s.a) map(from : s.b [0:2])
1707988422SAlexey Bataev
1807988422SAlexey Bataev typedef struct {
1907988422SAlexey Bataev int a;
2007988422SAlexey Bataev double *b;
2107988422SAlexey Bataev C1 c;
2207988422SAlexey Bataev } C;
2307988422SAlexey Bataev #pragma omp declare mapper(C s) map(to : s.a, s.c) map(from : s.b [0:2])
2407988422SAlexey Bataev
2507988422SAlexey Bataev typedef struct {
2607988422SAlexey Bataev int e;
2707988422SAlexey Bataev C f;
2807988422SAlexey Bataev int h;
2907988422SAlexey Bataev } D;
3007988422SAlexey Bataev
main()3107988422SAlexey Bataev int main() {
3207988422SAlexey Bataev constexpr int N = 10;
3307988422SAlexey Bataev D sa[2];
3407988422SAlexey Bataev double x[2], y[2];
3507988422SAlexey Bataev double x1[2], y1[2];
3607988422SAlexey Bataev y[1] = x[1] = 20;
3707988422SAlexey Bataev
3807988422SAlexey Bataev sa[0].e = 111;
3907988422SAlexey Bataev sa[0].f.a = 222;
4007988422SAlexey Bataev sa[0].f.c.a = 777;
4107988422SAlexey Bataev sa[0].f.b = &x[0];
4207988422SAlexey Bataev sa[0].f.c.b = &x1[0];
4307988422SAlexey Bataev sa[0].h = N;
4407988422SAlexey Bataev
4507988422SAlexey Bataev sa[1].e = 111;
4607988422SAlexey Bataev sa[1].f.a = 222;
4707988422SAlexey Bataev sa[1].f.c.a = 777;
4807988422SAlexey Bataev sa[1].f.b = &y[0];
4907988422SAlexey Bataev sa[1].f.c.b = &y1[0];
5007988422SAlexey Bataev sa[1].h = N;
5107988422SAlexey Bataev
5207988422SAlexey Bataev 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],
5307988422SAlexey Bataev sa[1].f.b == &x[0] ? 1 : 0);
5407988422SAlexey Bataev // CHECK: 111 222 777 20.00000 1
5507988422SAlexey Bataev
5607988422SAlexey Bataev __intptr_t p = reinterpret_cast<__intptr_t>(&y[0]);
5707988422SAlexey Bataev #pragma omp target map(tofrom : sa) firstprivate(p)
5807988422SAlexey Bataev {
5907988422SAlexey Bataev printf("%d %d %d\n", sa[1].f.a, sa[1].f.c.a,
6007988422SAlexey Bataev sa[1].f.b == reinterpret_cast<void *>(p) ? 1 : 0);
6107988422SAlexey Bataev // CHECK: 222 777 0
6207988422SAlexey Bataev sa[1].e = 333;
6307988422SAlexey Bataev sa[1].f.a = 444;
6407988422SAlexey Bataev sa[1].f.c.a = 555;
6507988422SAlexey Bataev sa[1].f.b[1] = 40;
6607988422SAlexey Bataev }
6707988422SAlexey Bataev 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],
6807988422SAlexey Bataev sa[1].f.b == &x[0] ? 1 : 0);
6907988422SAlexey Bataev // CHECK: 333 222 777 40.00000 1
7007988422SAlexey Bataev }
71