// { dg-do run } // { dg-options "-fopenmp" } #include struct S { int x[10]; }; struct T { struct S *s; }; struct U { struct T *t; }; void foo_siblist (void) { U *u = new U; u->t = new T; u->t->s = new S; 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) 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 u->t->s; delete u->t; delete u; } void foo (void) { U *u = new U; u->t = new T; u->t->s = new S; for (int i = 0; i < 10; i++) u->t->s->x[i] = 0; #pragma omp target map(*u, u->t, *(u->t), u->t->s, *u->t->s) 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 u->t->s; delete u->t; delete u; } void foo_tofrom (void) { U *u = new U; u->t = new T; u->t->s = new S; for (int i = 0; i < 10; i++) u->t->s->x[i] = 0; #pragma omp target map(u, *u, u->t, *(u->t), u->t->s, *u->t->s) 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 u->t->s; delete u->t; delete u; } void bar (void) { U *u = new U; U **up = &u; u->t = new T; u->t->s = new S; for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = 0; #pragma omp target map(*up, (*up)->t, *(*up)->t, (*up)->t->s, *(*up)->t->s) for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = i * 3; for (int i = 0; i < 10; i++) assert ((*up)->t->s->x[i] == i * 3); delete u->t->s; delete u->t; delete u; } void bar_pp (void) { U *u = new U; U **up = &u; u->t = new T; u->t->s = new S; for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = 0; #pragma omp target map(*up, **up, (*up)->t, *(*up)->t, (*up)->t->s, *(*up)->t->s) for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = i * 3; for (int i = 0; i < 10; i++) assert ((*up)->t->s->x[i] == i * 3); delete u->t->s; delete u->t; delete u; } void bar_tofrom (void) { U *u = new U; U **up = &u; u->t = new T; u->t->s = new S; for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = 0; #pragma omp target map(*up, up, (*up)->t, *(*up)->t, (*up)->t->s, *(*up)->t->s) for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = i * 3; for (int i = 0; i < 10; i++) assert ((*up)->t->s->x[i] == i * 3); delete u->t->s; delete u->t; delete u; } void bar_tofrom_pp (void) { U *u = new U; U **up = &u; u->t = new T; u->t->s = new S; for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = 0; #pragma omp target map(**up, *up, up, (*up)->t, *(*up)->t, (*up)->t->s, \ *(*up)->t->s) for (int i = 0; i < 10; i++) (*up)->t->s->x[i] = i * 3; for (int i = 0; i < 10; i++) assert ((*up)->t->s->x[i] == i * 3); delete u->t->s; delete u->t; delete u; } int main (int argc, char *argv[]) { foo_siblist (); foo (); foo_tofrom (); bar (); bar_pp (); bar_tofrom (); bar_tofrom_pp (); return 0; }