| // { 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 (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<typename X> |
| struct St |
| { |
| X x[10]; |
| }; |
| |
| template<typename X> |
| struct Tt |
| { |
| X ***s; |
| }; |
| |
| template<typename X> |
| struct Ut |
| { |
| X **t; |
| }; |
| |
| template<typename I> |
| void |
| tfoo (void) |
| { |
| Ut<Tt<St<I> > > *u = new Ut<Tt<St<I> > >; |
| Tt<St<I> > *real_t = new Tt<St<int> >; |
| St<I> *real_s = new St<int>; |
| Tt<St<I> > **t_pp = &real_t; |
| St<I> **s_pp = &real_s; |
| St<I> ***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<int> (); |
| return 0; |
| } |