// { dg-do run } // { dg-options "-fopenmp" } #include struct S { int x[10]; }; struct T { struct S ***s; }; struct U { struct T **t; }; void foo (void) { U *u = new U; T *real_t = new T; S *real_s = new S; T **t_pp = &real_t; S **s_pp = &real_s; S ***s_ppp = &s_pp; u->t = t_pp; (*u->t)->s = s_ppp; for (int i = 0; i < 10; i++) (**((*u->t)->s))->x[i] = 0; #pragma omp target map(u->t, *u->t, (*u->t)->s, *(*u->t)->s, **(*u->t)->s, \ (**(*u->t)->s)->x[0:10]) for (int i = 0; i < 10; i++) (**((*u->t)->s))->x[i] = i * 3; for (int i = 0; i < 10; i++) assert ((**((*u->t)->s))->x[i] == i * 3); delete real_s; delete real_t; delete u; } template struct St { X x[10]; }; template struct Tt { X ***s; }; template struct Ut { X **t; }; template void tfoo (void) { Ut > > *u = new Ut > >; Tt > *real_t = new Tt >; St *real_s = new St; Tt > **t_pp = &real_t; St **s_pp = &real_s; St ***s_ppp = &s_pp; u->t = t_pp; (*u->t)->s = s_ppp; for (int i = 0; i < 10; i++) (**((*u->t)->s))->x[i] = 0; #pragma omp target map(u->t, *u->t, (*u->t)->s, *(*u->t)->s, **(*u->t)->s, \ (**(*u->t)->s)->x[0:10]) for (int i = 0; i < 10; i++) (**((*u->t)->s))->x[i] = i * 3; for (int i = 0; i < 10; i++) assert ((**((*u->t)->s))->x[i] == i * 3); delete real_s; delete real_t; delete u; } int main (int argc, char *argv[]) { foo (); tfoo (); return 0; }