66 lines · cpp
1// RUN: %libomptarget-compilexx-run-and-check-generic2 3#include <cstdio>4#include <cstdlib>5 6typedef struct {7 int a;8 double *b;9} C;10#pragma omp declare mapper(id1 : C s) map(to : s.a) map(from : s.b[0 : 2])11 12typedef struct {13 int e;14 C f;15 int h;16 short *g;17} D;18#pragma omp declare mapper(default : D r) map(from : r.e) \19 map(mapper(id1), tofrom : r.f) map(tofrom : r.g[0 : r.h])20 21int main() {22 constexpr int N = 10;23 D s;24 s.e = 111;25 s.f.a = 222;26 double x[2];27 x[1] = 20;28 short y[N];29 y[1] = 30;30 s.f.b = &x[0];31 s.g = &y[0];32 s.h = N;33 34 D *sp = &s;35 D **spp = &sp;36 37 printf("%d %d %4.5f %d %d %d\n", spp[0][0].e, spp[0][0].f.a, spp[0][0].f.b[1],38 spp[0][0].f.b == &x[0] ? 1 : 0, spp[0][0].g[1],39 spp[0][0].g == &y[0] ? 1 : 0);40 // CHECK: 111 222 20.00000 1 30 141 42 int spp00fa = -1, spp00fb_r = -1, spp00fg1 = -1, spp00fg_r = -1;43 __intptr_t p = reinterpret_cast<__intptr_t>(&x[0]),44 p1 = reinterpret_cast<__intptr_t>(&y[0]);45#pragma omp target map(tofrom : spp[0][0]) map(alloc : spp[0]) \46 firstprivate(p, p1) map(from : spp00fa, spp00fb_r, spp00fg1, spp00fg_r)47 {48 spp00fa = spp[0][0].f.a;49 spp00fb_r = spp[0][0].f.b == reinterpret_cast<void *>(p) ? 1 : 0;50 spp00fg1 = spp[0][0].g[1];51 spp00fg_r = spp[0][0].g == reinterpret_cast<void *>(p1) ? 1 : 0;52 printf("%d %d %d %d\n", spp00fa, spp00fb_r, spp00fg1, spp00fg_r);53 // XCHECK: 222 0 30 054 spp[0][0].e = 333;55 spp[0][0].f.a = 444;56 spp[0][0].f.b[1] = 40;57 spp[0][0].g[1] = 50;58 }59 printf("%d %d %d %d\n", spp00fa, spp00fb_r, spp00fg1, spp00fg_r);60 // CHECK: 222 0 30 061 printf("%d %d %4.5f %d %d %d\n", spp[0][0].e, spp[0][0].f.a, spp[0][0].f.b[1],62 spp[0][0].f.b == &x[0] ? 1 : 0, spp[0][0].g[1],63 spp[0][0].g == &y[0] ? 1 : 0);64 // CHECK: 333 222 40.00000 1 50 165}66