blob: 4566854e60aefee8b9d2de0e87cf770e99ade41d [file] [log] [blame]
// { dg-do run }
// { dg-options "-fopenmp" }
#include <cassert>
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;
}