// { dg-do run } #include #include struct S { int *myarr; }; #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:20]) namespace A { #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[0:100]) } namespace B { #pragma omp declare mapper (S s) map(to:s.myarr) map (tofrom: s.myarr[100:100]) } namespace A { void incr_a (S &my_s) { #pragma omp target { for (int i = 0; i < 100; i++) my_s.myarr[i]++; } } } namespace B { void incr_b (S &my_s) { #pragma omp target { for (int i = 100; i < 200; i++) my_s.myarr[i]++; } } } int main (int argc, char *argv[]) { S my_s; my_s.myarr = (int *) calloc (200, sizeof (int)); #pragma omp target { for (int i = 0; i < 20; i++) my_s.myarr[i]++; } A::incr_a (my_s); B::incr_b (my_s); for (int i = 0; i < 200; i++) assert (my_s.myarr[i] == (i < 20) ? 2 : 1); return 0; }