// { dg-do run } // This is essentially baseptrs-4.C with templates. #include #include #define MAP_DECLS #define NONREF_DECL_BASE #define REF_DECL_BASE #define PTR_DECL_BASE #define REF2PTR_DECL_BASE #define ARRAY_DECL_BASE #define REF2ARRAY_DECL_BASE #define PTR_OFFSET_DECL_BASE #define REF2PTR_OFFSET_DECL_BASE #define MAP_SECTIONS #define NONREF_DECL_MEMBER_SLICE #define NONREF_DECL_MEMBER_SLICE_BASEPTR #define REF_DECL_MEMBER_SLICE #define REF_DECL_MEMBER_SLICE_BASEPTR #define PTR_DECL_MEMBER_SLICE #define PTR_DECL_MEMBER_SLICE_BASEPTR #define REF2PTR_DECL_MEMBER_SLICE #define REF2PTR_DECL_MEMBER_SLICE_BASEPTR #define ARRAY_DECL_MEMBER_SLICE #define ARRAY_DECL_MEMBER_SLICE_BASEPTR #define REF2ARRAY_DECL_MEMBER_SLICE #define REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR #define PTR_OFFSET_DECL_MEMBER_SLICE #define PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR #define REF2PTR_OFFSET_DECL_MEMBER_SLICE #define REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR #define PTRARRAY_DECL_MEMBER_SLICE #define PTRARRAY_DECL_MEMBER_SLICE_BASEPTR #define REF2PTRARRAY_DECL_MEMBER_SLICE #define REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR #define PTRPTR_OFFSET_DECL_MEMBER_SLICE #define PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR #define REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE #define REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR #define NONREF_COMPONENT_BASE #define NONREF_COMPONENT_MEMBER_SLICE #define NONREF_COMPONENT_MEMBER_SLICE_BASEPTR #define REF_COMPONENT_BASE #define REF_COMPONENT_MEMBER_SLICE #define REF_COMPONENT_MEMBER_SLICE_BASEPTR #define PTR_COMPONENT_BASE #define PTR_COMPONENT_MEMBER_SLICE #define PTR_COMPONENT_MEMBER_SLICE_BASEPTR #define REF2PTR_COMPONENT_BASE #define REF2PTR_COMPONENT_MEMBER_SLICE #define REF2PTR_COMPONENT_MEMBER_SLICE_BASEPTR #ifdef MAP_DECLS template void map_decls (void) { int x = 0; int &y = x; int arr[4]; int (&arrref)[N] = arr; int *z = &arr[0]; int *&t = z; memset (arr, 0, sizeof arr); #pragma omp target map(x) { x++; } #pragma omp target map(y) { y++; } assert (x == 2); assert (y == 2); /* "A variable that is of type pointer is treated as if it is the base pointer of a zero-length array section that appeared as a list item in a map clause." */ #pragma omp target map(z) { z++; } /* "A variable that is of type reference to pointer is treated as if it had appeared in a map clause as a zero-length array section." The pointer here is *not* associated with a target address, so we're not disallowed from modifying it. */ #pragma omp target map(t) { t++; } assert (z == &arr[2]); assert (t == &arr[2]); #pragma omp target map(arr) { arr[2]++; } #pragma omp target map(arrref) { arrref[2]++; } assert (arr[2] == 2); assert (arrref[2] == 2); } #endif template struct S { T a; T &b; T *c; T *&d; T e[4]; T (&f)[4]; S(T a1, T &b1, T *c1, T *&d1) : a(a1), b(b1), c(c1), d(d1), f(e) { memset (e, 0, sizeof e); } }; #ifdef NONREF_DECL_BASE template void nonref_decl_base (void) { T a = 0, b = 0, c, *d = &c; S mys(a, b, &c, d); #pragma omp target map(mys.a) { mys.a++; } #pragma omp target map(mys.b) { mys.b++; } assert (mys.a == 1); assert (mys.b == 1); #pragma omp target map(mys.c) { mys.c++; } #pragma omp target map(mys.d) { mys.d++; } assert (mys.c == &c + 1); assert (mys.d == &c + 1); #pragma omp target map(mys.e) { mys.e[0]++; } #pragma omp target map(mys.f) { mys.f[0]++; } assert (mys.e[0] == 2); assert (mys.f[0] == 2); } #endif #ifdef REF_DECL_BASE template void ref_decl_base (void) { T a = 0, b = 0, c, *d = &c; S mys_orig(a, b, &c, d); S &mys = mys_orig; #pragma omp target map(mys.a) { mys.a++; } #pragma omp target map(mys.b) { mys.b++; } assert (mys.a == 1); assert (mys.b == 1); #pragma omp target map(mys.c) { mys.c++; } #pragma omp target map(mys.d) { mys.d++; } assert (mys.c == &c + 1); assert (mys.d == &c + 1); #pragma omp target map(mys.e) { mys.e[0]++; } #pragma omp target map(mys.f) { mys.f[0]++; } assert (mys.e[0] == 2); assert (mys.f[0] == 2); } #endif #ifdef PTR_DECL_BASE template void ptr_decl_base (void) { A a = 0, b = 0, c, *d = &c; S mys_orig(a, b, &c, d); S *mys = &mys_orig; #pragma omp target map(mys->a) { mys->a++; } #pragma omp target map(mys->b) { mys->b++; } assert (mys->a == 1); assert (mys->b == 1); #pragma omp target map(mys->c) { mys->c++; } #pragma omp target map(mys->d) { mys->d++; } assert (mys->c == &c + 1); assert (mys->d == &c + 1); #pragma omp target map(mys->e) { mys->e[0]++; } #pragma omp target map(mys->f) { mys->f[0]++; } assert (mys->e[0] == 2); assert (mys->f[0] == 2); } #endif #ifdef REF2PTR_DECL_BASE template void ref2ptr_decl_base (void) { A a = 0, b = 0, c, *d = &c; S mys_orig(a, b, &c, d); S *mysp = &mys_orig; S *&mys = mysp; #pragma omp target map(mys->a) { mys->a++; } #pragma omp target map(mys->b) { mys->b++; } assert (mys->a == 1); assert (mys->b == 1); #pragma omp target map(mys->c) { mys->c++; } #pragma omp target map(mys->d) { mys->d++; } assert (mys->c == &c + 1); assert (mys->d == &c + 1); #pragma omp target map(mys->e) { mys->e[0]++; } #pragma omp target map(mys->f) { mys->f[0]++; } assert (mys->e[0] == 2); assert (mys->f[0] == 2); } #endif #ifdef ARRAY_DECL_BASE template void array_decl_base (void) { A a = 0, b = 0, c, *d = &c; S mys[4] = { S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d) }; #pragma omp target map(mys[2].a) { mys[2].a++; } #pragma omp target map(mys[2].b) { mys[2].b++; } assert (mys[2].a == 1); assert (mys[2].b == 1); #pragma omp target map(mys[2].c) { mys[2].c++; } #pragma omp target map(mys[2].d) { mys[2].d++; } assert (mys[2].c == &c + 1); assert (mys[2].d == &c + 1); #pragma omp target map(mys[2].e) { mys[2].e[0]++; } #pragma omp target map(mys[2].f) { mys[2].f[0]++; } assert (mys[2].e[0] == 2); assert (mys[2].f[0] == 2); } #endif #ifdef REF2ARRAY_DECL_BASE template void ref2array_decl_base (void) { A a = 0, b = 0, c, *d = &c; S mys_orig[4] = { S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d) }; S (&mys)[4] = mys_orig; #pragma omp target map(mys[2].a) { mys[2].a++; } #pragma omp target map(mys[2].b) { mys[2].b++; } assert (mys[2].a == 1); assert (mys[2].b == 1); #pragma omp target map(mys[2].c) { mys[2].c++; } #pragma omp target map(mys[2].d) { mys[2].d++; } assert (mys[2].c == &c + 1); assert (mys[2].d == &c + 1); #pragma omp target map(mys[2].e) { mys[2].e[0]++; } #pragma omp target map(mys[2].f) { mys[2].f[0]++; } assert (mys[2].e[0] == 2); assert (mys[2].f[0] == 2); } #endif #ifdef PTR_OFFSET_DECL_BASE template void ptr_offset_decl_base (void) { A a = 0, b = 0, c, *d = &c; S mys_orig[4] = { S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d) }; S *mys = &mys_orig[0]; #pragma omp target map(mys[2].a) { mys[2].a++; } #pragma omp target map(mys[2].b) { mys[2].b++; } assert (mys[2].a == 1); assert (mys[2].b == 1); #pragma omp target map(mys[2].c) { mys[2].c++; } #pragma omp target map(mys[2].d) { mys[2].d++; } assert (mys[2].c == &c + 1); assert (mys[2].d == &c + 1); #pragma omp target map(mys[2].e) { mys[2].e[0]++; } #pragma omp target map(mys[2].f) { mys[2].f[0]++; } assert (mys[2].e[0] == 2); assert (mys[2].f[0] == 2); } #endif #ifdef REF2PTR_OFFSET_DECL_BASE template void ref2ptr_offset_decl_base (void) { A a = 0, b = 0, c, *d = &c; S mys_orig[4] = { S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d), S(a, b, &c, d) }; S *mys_ptr = &mys_orig[0]; S *&mys = mys_ptr; #pragma omp target map(mys[2].a) { mys[2].a++; } #pragma omp target map(mys[2].b) { mys[2].b++; } assert (mys[2].a == 1); assert (mys[2].b == 1); #pragma omp target map(mys[2].c) { mys[2].c++; } #pragma omp target map(mys[2].d) { mys[2].d++; } assert (mys[2].c == &c + 1); assert (mys[2].d == &c + 1); #pragma omp target map(mys[2].e) { mys[2].e[0]++; } #pragma omp target map(mys[2].f) { mys[2].f[0]++; } assert (mys[2].e[0] == 2); assert (mys[2].f[0] == 2); } #endif #ifdef MAP_SECTIONS template void map_sections (void) { A arr[B]; A *ptr; A (&arrref)[B] = arr; A *&ptrref = ptr; ptr = new int[B]; memset (ptr, 0, sizeof (int) * B); memset (arr, 0, sizeof (int) * B); #pragma omp target map(arr[0:B]) { arr[2]++; } #pragma omp target map(ptr[0:B]) { ptr[2]++; } #pragma omp target map(arrref[0:B]) { arrref[2]++; } #pragma omp target map(ptrref[0:B]) { ptrref[2]++; } assert (arr[2] == 2); assert (ptr[2] == 2); delete ptr; } #endif template struct T { A a[10]; A (&b)[10]; A *c; A *&d; T(A (&b1)[10], A *c1, A *&d1) : b(b1), c(c1), d(d1) { memset (a, 0, sizeof a); } }; #ifdef NONREF_DECL_MEMBER_SLICE template void nonref_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt(c, &c[0], d); memset (c, 0, sizeof c); #pragma omp target map(myt.a[0:B]) { myt.a[2]++; } #pragma omp target map(myt.b[0:B]) { myt.b[2]++; } #pragma omp target enter data map(to: myt.c) #pragma omp target map(myt.c[0:B]) { myt.c[2]++; } #pragma omp target exit data map(release: myt.c) #pragma omp target enter data map(to: myt.d) #pragma omp target map(myt.d[0:B]) { myt.d[2]++; } #pragma omp target exit data map(from: myt.d) assert (myt.a[2] == 1); assert (myt.b[2] == 3); assert (myt.c[2] == 3); assert (myt.d[2] == 3); } #endif #ifdef NONREF_DECL_MEMBER_SLICE_BASEPTR template void nonref_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt(c, &c[0], d); memset (c, 0, sizeof c); #pragma omp target map(to:myt.c) map(myt.c[0:B]) { myt.c[2]++; } #pragma omp target map(to:myt.d) map(myt.d[0:B]) { myt.d[2]++; } assert (myt.c[2] == 2); assert (myt.d[2] == 2); } #endif #ifdef REF_DECL_MEMBER_SLICE template void ref_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T &myt = myt_real; memset (c, 0, sizeof c); #pragma omp target map(myt.a[0:B]) { myt.a[2]++; } #pragma omp target map(myt.b[0:B]) { myt.b[2]++; } #pragma omp target enter data map(to: myt.c) #pragma omp target map(myt.c[0:B]) { myt.c[2]++; } #pragma omp target exit data map(release: myt.c) #pragma omp target enter data map(to: myt.d) #pragma omp target map(myt.d[0:B]) { myt.d[2]++; } #pragma omp target exit data map(release: myt.d) assert (myt.a[2] == 1); assert (myt.b[2] == 3); assert (myt.c[2] == 3); assert (myt.d[2] == 3); } #endif #ifdef REF_DECL_MEMBER_SLICE_BASEPTR template void ref_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T &myt = myt_real; memset (c, 0, sizeof c); #pragma omp target map(to:myt.c) map(myt.c[0:B]) { myt.c[2]++; } #pragma omp target map(to:myt.d) map(myt.d[0:B]) { myt.d[2]++; } assert (myt.c[2] == 2); assert (myt.d[2] == 2); } #endif #ifdef PTR_DECL_MEMBER_SLICE template void ptr_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt = &myt_real; memset (c, 0, sizeof c); #pragma omp target enter data map(to: myt) #pragma omp target map(myt->a[0:B]) { myt->a[2]++; } #pragma omp target map(myt->b[0:B]) { myt->b[2]++; } #pragma omp target enter data map(to: myt->c) #pragma omp target map(myt->c[0:B]) { myt->c[2]++; } #pragma omp target exit data map(release: myt->c) #pragma omp target enter data map(to: myt->d) #pragma omp target map(myt->d[0:B]) { myt->d[2]++; } #pragma omp target exit data map(release: myt, myt->d) assert (myt->a[2] == 1); assert (myt->b[2] == 3); assert (myt->c[2] == 3); assert (myt->d[2] == 3); } #endif #ifdef PTR_DECL_MEMBER_SLICE_BASEPTR template void ptr_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt = &myt_real; memset (c, 0, sizeof c); // These ones have an implicit firstprivate for 'myt'. #pragma omp target map(to:myt->c) map(myt->c[0:B]) { myt->c[2]++; } #pragma omp target map(to:myt->d) map(myt->d[0:B]) { myt->d[2]++; } // These ones have an explicit "TO" mapping for 'myt'. #pragma omp target map(to:myt) map(to:myt->c) map(myt->c[0:B]) { myt->c[2]++; } #pragma omp target map(to:myt) map(to:myt->d) map(myt->d[0:B]) { myt->d[2]++; } assert (myt->c[2] == 4); assert (myt->d[2] == 4); } #endif #ifdef REF2PTR_DECL_MEMBER_SLICE template void ref2ptr_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptr = &myt_real; T *&myt = myt_ptr; memset (c, 0, sizeof c); #pragma omp target enter data map(to: myt) #pragma omp target map(myt->a[0:B]) { myt->a[2]++; } #pragma omp target map(myt->b[0:B]) { myt->b[2]++; } #pragma omp target enter data map(to: myt->c) #pragma omp target map(myt->c[0:B]) { myt->c[2]++; } #pragma omp target exit data map(release: myt->c) #pragma omp target enter data map(to: myt->d) #pragma omp target map(myt->d[0:B]) { myt->d[2]++; } #pragma omp target exit data map(from: myt, myt->d) assert (myt->a[2] == 1); assert (myt->b[2] == 3); assert (myt->c[2] == 3); assert (myt->d[2] == 3); } #endif #ifdef REF2PTR_DECL_MEMBER_SLICE_BASEPTR template void ref2ptr_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptr = &myt_real; T *&myt = myt_ptr; memset (c, 0, sizeof c); // These ones have an implicit firstprivate for 'myt'. #pragma omp target map(to:myt->c) map(myt->c[0:B]) { myt->c[2]++; } #pragma omp target map(to:myt->d) map(myt->d[0:B]) { myt->d[2]++; } // These ones have an explicit "TO" mapping for 'myt'. #pragma omp target map(to:myt) map(to:myt->c) map(myt->c[0:B]) { myt->c[2]++; } #pragma omp target map(to:myt) map(to:myt->d) map(myt->d[0:B]) { myt->d[2]++; } assert (myt->c[2] == 4); assert (myt->d[2] == 4); } #endif #ifdef ARRAY_DECL_MEMBER_SLICE template void array_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; memset (c, 0, sizeof c); #pragma omp target map(myt[2].a[0:B]) { myt[2].a[2]++; } #pragma omp target map(myt[2].b[0:B]) { myt[2].b[2]++; } #pragma omp target enter data map(to: myt[2].c) #pragma omp target map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target exit data map(release: myt[2].c) #pragma omp target enter data map(to: myt[2].d) #pragma omp target map(myt[2].d[0:B]) { myt[2].d[2]++; } #pragma omp target exit data map(release: myt[2].d) assert (myt[2].a[2] == 1); assert (myt[2].b[2] == 3); assert (myt[2].c[2] == 3); assert (myt[2].d[2] == 3); } #endif #ifdef ARRAY_DECL_MEMBER_SLICE_BASEPTR template void array_decl_member_slice_baseptr (void) { A c[10]; A *d = &c[0]; T myt[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; memset (c, 0, sizeof c); #pragma omp target map(to:myt[2].c) map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target map(to:myt[2].d) map(myt[2].d[0:B]) { myt[2].d[2]++; } assert (myt[2].c[2] == 2); assert (myt[2].d[2] == 2); } #endif #ifdef REF2ARRAY_DECL_MEMBER_SLICE template void ref2array_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; T (&myt)[4] = myt_real; memset (c, 0, sizeof c); #pragma omp target map(myt[2].a[0:B]) { myt[2].a[2]++; } #pragma omp target map(myt[2].b[0:B]) { myt[2].b[2]++; } #pragma omp target enter data map(to: myt[2].c) #pragma omp target map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target exit data map(release: myt[2].c) #pragma omp target enter data map(to: myt[2].d) #pragma omp target map(myt[2].d[0:B]) { myt[2].d[2]++; } #pragma omp target exit data map(release: myt[2].d) assert (myt[2].a[2] == 1); assert (myt[2].b[2] == 3); assert (myt[2].c[2] == 3); assert (myt[2].d[2] == 3); } #endif #ifdef REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR template void ref2array_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; T (&myt)[4] = myt_real; memset (c, 0, sizeof c); #pragma omp target map(to:myt[2].c) map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target map(to:myt[2].d) map(myt[2].d[0:B]) { myt[2].d[2]++; } assert (myt[2].c[2] == 2); assert (myt[2].d[2] == 2); } #endif #ifdef PTR_OFFSET_DECL_MEMBER_SLICE template void ptr_offset_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; T *myt = &myt_real[0]; memset (c, 0, sizeof c); #pragma omp target map(myt[2].a[0:B]) { myt[2].a[2]++; } #pragma omp target map(myt[2].b[0:B]) { myt[2].b[2]++; } #pragma omp target enter data map(to: myt[2].c) #pragma omp target map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target exit data map(release: myt[2].c) #pragma omp target enter data map(to: myt[2].d) #pragma omp target map(myt[2].d[0:B]) { myt[2].d[2]++; } #pragma omp target exit data map(release: myt[2].d) assert (myt[2].a[2] == 1); assert (myt[2].b[2] == 3); assert (myt[2].c[2] == 3); assert (myt[2].d[2] == 3); } #endif #ifdef PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR template void ptr_offset_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; T *myt = &myt_real[0]; memset (c, 0, sizeof c); /* Implicit 'myt'. */ #pragma omp target map(to:myt[2].c) map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target map(to:myt[2].d) map(myt[2].d[0:B]) { myt[2].d[2]++; } /* Explicit 'to'-mapped 'myt'. */ #pragma omp target map(to:myt) map(to:myt[2].c) map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target map(to:myt) map(to:myt[2].d) map(myt[2].d[0:B]) { myt[2].d[2]++; } assert (myt[2].c[2] == 4); assert (myt[2].d[2] == 4); } #endif #ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE template void ref2ptr_offset_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; T *myt_ptr = &myt_real[0]; T *&myt = myt_ptr; memset (c, 0, sizeof c); #pragma omp target map(myt[2].a[0:B]) { myt[2].a[2]++; } #pragma omp target map(myt[2].b[0:B]) { myt[2].b[2]++; } #pragma omp target enter data map(to: myt[2].c) #pragma omp target map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target exit data map(release: myt[2].c) #pragma omp target enter data map(to: myt[2].d) #pragma omp target map(myt[2].d[0:B]) { myt[2].d[2]++; } #pragma omp target exit data map(release: myt[2].d) assert (myt[2].a[2] == 1); assert (myt[2].b[2] == 3); assert (myt[2].c[2] == 3); assert (myt[2].d[2] == 3); } #endif #ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR template void ref2ptr_offset_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real[4] = { T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d), T (c, &c[0], d) }; T *myt_ptr = &myt_real[0]; T *&myt = myt_ptr; memset (c, 0, sizeof c); /* Implicit 'myt'. */ #pragma omp target map(to:myt[2].c) map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target map(to:myt[2].d) map(myt[2].d[0:B]) { myt[2].d[2]++; } /* Explicit 'to'-mapped 'myt'. */ #pragma omp target map(to:myt) map(to:myt[2].c) map(myt[2].c[0:B]) { myt[2].c[2]++; } #pragma omp target map(to:myt) map(to:myt[2].d) map(myt[2].d[0:B]) { myt[2].d[2]++; } assert (myt[2].c[2] == 4); assert (myt[2].d[2] == 4); } #endif #ifdef PTRARRAY_DECL_MEMBER_SLICE template void ptrarray_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt[4] = { &myt_real, &myt_real, &myt_real, &myt_real }; memset (c, 0, sizeof c); #pragma omp target enter data map(to: myt[2]) #pragma omp target map(myt[2]->a[0:B]) { myt[2]->a[2]++; } #pragma omp target map(myt[2]->b[0:B]) { myt[2]->b[2]++; } #pragma omp target enter data map(to: myt[2]->c) #pragma omp target map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target exit data map(from: myt[2]->c) #pragma omp target enter data map(to: myt[2]->d) #pragma omp target map(myt[2]->d[0:B]) { myt[2]->d[2]++; } #pragma omp target exit data map(from: myt[2]->d) #pragma omp target exit data map(release: myt[2]) assert (myt[2]->a[2] == 1); assert (myt[2]->b[2] == 3); assert (myt[2]->c[2] == 3); assert (myt[2]->d[2] == 3); } #endif #ifdef PTRARRAY_DECL_MEMBER_SLICE_BASEPTR template void ptrarray_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt[4] = { &myt_real, &myt_real, &myt_real, &myt_real }; memset (c, 0, sizeof c); // Implicit 'myt' #pragma omp target map(to: myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to: myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } // One element of 'myt' #pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } // Explicit map of all of 'myt' #pragma omp target map(to:myt, myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt, myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } // Explicit map slice of 'myt' #pragma omp target map(to:myt[1:3], myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt[1:3], myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } assert (myt[2]->c[2] == 8); assert (myt[2]->d[2] == 8); } #endif #ifdef REF2PTRARRAY_DECL_MEMBER_SLICE template void ref2ptrarray_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptrarr[4] = { &myt_real, &myt_real, &myt_real, &myt_real }; T *(&myt)[4] = myt_ptrarr; memset (c, 0, sizeof c); #pragma omp target enter data map(to: myt[2]) #pragma omp target map(myt[2]->a[0:B]) { myt[2]->a[2]++; } #pragma omp target map(myt[2]->b[0:B]) { myt[2]->b[2]++; } #pragma omp target enter data map(to: myt[2]->c) #pragma omp target map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target exit data map(release: myt[2]->c) #pragma omp target enter data map(to: myt[2]->d) #pragma omp target map(myt[2]->d[0:B]) { myt[2]->d[2]++; } #pragma omp target exit data map(release: myt[2]->d) #pragma omp target exit data map(release: myt[2]) assert (myt[2]->a[2] == 1); assert (myt[2]->b[2] == 3); assert (myt[2]->c[2] == 3); assert (myt[2]->d[2] == 3); } #endif #ifdef REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR template void ref2ptrarray_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptrarr[4] = { &myt_real, &myt_real, &myt_real, &myt_real }; T *(&myt)[4] = myt_ptrarr; memset (c, 0, sizeof c); #pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } #pragma omp target map(to:myt, myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt, myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } assert (myt[2]->c[2] == 4); assert (myt[2]->d[2] == 4); } #endif #ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE template void ptrptr_offset_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptrarr[4] = { &myt_real, &myt_real, &myt_real, &myt_real }; T **myt = &myt_ptrarr[0]; memset (c, 0, sizeof c); #pragma omp target enter data map(to: myt[0:3]) /* NOTE: For the implicit firstprivate 'myt' to work, the zeroth element of myt[] must be mapped above -- otherwise the zero-length array section lookup fails. */ #pragma omp target map(myt[2]->a[0:B]) { myt[2]->a[2]++; } #pragma omp target map(myt[2]->b[0:B]) { myt[2]->b[2]++; } #pragma omp target enter data map(to: myt[2]->c) #pragma omp target map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target exit data map(from: myt[2]->c) #pragma omp target enter data map(to: myt[2]->d) #pragma omp target map(myt[2]->d[0:B]) { myt[2]->d[2]++; } #pragma omp target exit data map(from: myt[0:3], myt[2]->d) assert (myt[2]->a[2] == 1); assert (myt[2]->b[2] == 3); assert (myt[2]->c[2] == 3); assert (myt[2]->d[2] == 3); } #endif #ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR template void ptrptr_offset_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptrarr[4] = { 0, 0, 0, &myt_real }; T **myt = &myt_ptrarr[0]; memset (c, 0, sizeof c); #pragma omp target map(to:myt[3], myt[3]->c) map(myt[3]->c[0:B]) { myt[3]->c[2]++; } #pragma omp target map(to:myt[3], myt[3]->d) map(myt[3]->d[0:B]) { myt[3]->d[2]++; } #pragma omp target map(to:myt, myt[3], myt[3]->c) map(myt[3]->c[0:B]) { myt[3]->c[2]++; } #pragma omp target map(to:myt, myt[3], myt[3]->d) map(myt[3]->d[0:B]) { myt[3]->d[2]++; } assert (myt[3]->c[2] == 4); assert (myt[3]->d[2] == 4); } #endif #ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE template void ref2ptrptr_offset_decl_member_slice (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptrarr[4] = { 0, 0, &myt_real, 0 }; T **myt_ptrptr = &myt_ptrarr[0]; T **&myt = myt_ptrptr; memset (c, 0, sizeof c); /* See comment in baseptrs-4.C:ref2ptrptr_offset_decl_member_slice. */ #pragma omp target enter data map(to: myt, myt[0:3]) #pragma omp target map(myt[2]->a[0:B]) { myt[2]->a[2]++; } #pragma omp target map(myt[2]->b[0:B]) { myt[2]->b[2]++; } #pragma omp target enter data map(to:myt[2]->c) #pragma omp target map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target exit data map(release:myt[2]->c) #pragma omp target enter data map(to:myt[2]->d) #pragma omp target map(myt[2]->d[0:B]) { myt[2]->d[2]++; } #pragma omp target exit data map(release: myt, myt[0:3], myt[2]->d) assert (myt[2]->a[2] == 1); assert (myt[2]->b[2] == 3); assert (myt[2]->c[2] == 3); assert (myt[2]->d[2] == 3); } #endif #ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR template void ref2ptrptr_offset_decl_member_slice_baseptr (void) { A c[B]; A *d = &c[0]; T myt_real(c, &c[0], d); T *myt_ptrarr[4] = { 0, 0, &myt_real, 0 }; T **myt_ptrptr = &myt_ptrarr[0]; T **&myt = myt_ptrptr; memset (c, 0, sizeof c); #pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } #pragma omp target map(to:myt, myt[2], myt[2]->c) map(myt[2]->c[0:B]) { myt[2]->c[2]++; } #pragma omp target map(to:myt, myt[2], myt[2]->d) map(myt[2]->d[0:B]) { myt[2]->d[2]++; } assert (myt[2]->c[2] == 4); assert (myt[2]->d[2] == 4); } #endif template struct U { S s1; T t1; S &s2; T &t2; S *s3; T *t3; S *&s4; T *&t4; U(S &sptr1, T &tptr1, S &sptr2, T &tptr2, S *sptr3, T *tptr3, S *&sptr4, T *&tptr4) : s1(sptr1), t1(tptr1), s2(sptr2), t2(tptr2), s3(sptr3), t3(tptr3), s4(sptr4), t4(tptr4) { } }; #define INIT_S(N) \ A a##N = 0, b##N = 0, c##N = 0, d##N = 0; \ A *d##N##ptr = &d##N; \ S s##N(a##N, b##N, &c##N, d##N##ptr) #define INIT_T(N) \ A arr##N[10]; \ A *ptr##N = &arr##N[0]; \ T t##N(arr##N, &arr##N[0], ptr##N); \ memset (arr##N, 0, sizeof arr##N) #define INIT_ST \ INIT_S(1); \ INIT_T(1); \ INIT_S(2); \ INIT_T(2); \ INIT_S(3); \ INIT_T(3); \ A a4 = 0, b4 = 0, c4 = 0, d4 = 0; \ A *d4ptr = &d4; \ S *s4 = new S(a4, b4, &c4, d4ptr); \ A arr4[10]; \ A *ptr4 = &arr4[0]; \ T *t4 = new T(arr4, &arr4[0], ptr4); \ memset (arr4, 0, sizeof arr4) #ifdef NONREF_COMPONENT_BASE template void nonref_component_base (void) { INIT_ST; U myu(s1, t1, s2, t2, &s3, &t3, s4, t4); #pragma omp target map(myu.s1.a, myu.s1.b, myu.s1.c, myu.s1.d) { myu.s1.a++; myu.s1.b++; myu.s1.c++; myu.s1.d++; } assert (myu.s1.a == 1); assert (myu.s1.b == 1); assert (myu.s1.c == &c1 + 1); assert (myu.s1.d == &d1 + 1); #pragma omp target map(myu.s2.a, myu.s2.b, myu.s2.c, myu.s2.d) { myu.s2.a++; myu.s2.b++; myu.s2.c++; myu.s2.d++; } assert (myu.s2.a == 1); assert (myu.s2.b == 1); assert (myu.s2.c == &c2 + 1); assert (myu.s2.d == &d2 + 1); #pragma omp target map(to:myu.s3) \ map(myu.s3->a, myu.s3->b, myu.s3->c, myu.s3->d) { myu.s3->a++; myu.s3->b++; myu.s3->c++; myu.s3->d++; } assert (myu.s3->a == 1); assert (myu.s3->b == 1); assert (myu.s3->c == &c3 + 1); assert (myu.s3->d == &d3 + 1); #pragma omp target map(to:myu.s4) \ map(myu.s4->a, myu.s4->b, myu.s4->c, myu.s4->d) { myu.s4->a++; myu.s4->b++; myu.s4->c++; myu.s4->d++; } assert (myu.s4->a == 1); assert (myu.s4->b == 1); assert (myu.s4->c == &c4 + 1); assert (myu.s4->d == &d4 + 1); delete s4; delete t4; } #endif #ifdef NONREF_COMPONENT_MEMBER_SLICE template void nonref_component_member_slice (void) { INIT_ST; U myu(s1, t1, s2, t2, &s3, &t3, s4, t4); #pragma omp target map(myu.t1.a[2:5]) { myu.t1.a[2]++; } #pragma omp target map(myu.t1.b[2:5]) { myu.t1.b[2]++; } #pragma omp target enter data map(to: myu.t1.c) #pragma omp target map(myu.t1.c[2:5]) { myu.t1.c[2]++; } #pragma omp target exit data map(release: myu.t1.c) #pragma omp target enter data map(to: myu.t1.d) #pragma omp target map(myu.t1.d[2:5]) { myu.t1.d[2]++; } #pragma omp target exit data map(from: myu.t1.d) assert (myu.t1.a[2] == 1); assert (myu.t1.b[2] == 3); assert (myu.t1.c[2] == 3); assert (myu.t1.d[2] == 3); #pragma omp target map(myu.t2.a[2:5]) { myu.t2.a[2]++; } #pragma omp target map(myu.t2.b[2:5]) { myu.t2.b[2]++; } #pragma omp target enter data map(to: myu.t2.c) #pragma omp target map(myu.t2.c[2:5]) { myu.t2.c[2]++; } #pragma omp target exit data map(release: myu.t2.c) #pragma omp target enter data map(to: myu.t2.d) #pragma omp target map(myu.t2.d[2:5]) { myu.t2.d[2]++; } #pragma omp target exit data map(release: myu.t2.d) assert (myu.t2.a[2] == 1); assert (myu.t2.b[2] == 3); assert (myu.t2.c[2] == 3); assert (myu.t2.d[2] == 3); #pragma omp target enter data map(to: myu.t3) #pragma omp target map(myu.t3->a[2:5]) { myu.t3->a[2]++; } #pragma omp target map(myu.t3->b[2:5]) { myu.t3->b[2]++; } #pragma omp target enter data map(to: myu.t3->c) #pragma omp target map(myu.t3->c[2:5]) { myu.t3->c[2]++; } #pragma omp target exit data map(release: myu.t3->c) #pragma omp target enter data map(to: myu.t3->d) #pragma omp target map(myu.t3->d[2:5]) { myu.t3->d[2]++; } #pragma omp target exit data map(release: myu.t3, myu.t3->d) assert (myu.t3->a[2] == 1); assert (myu.t3->b[2] == 3); assert (myu.t3->c[2] == 3); assert (myu.t3->d[2] == 3); #pragma omp target enter data map(to: myu.t4) #pragma omp target map(myu.t4->a[2:5]) { myu.t4->a[2]++; } #pragma omp target map(myu.t4->b[2:5]) { myu.t4->b[2]++; } #pragma omp target enter data map(to: myu.t4->c) #pragma omp target map(myu.t4->c[2:5]) { myu.t4->c[2]++; } #pragma omp target exit data map(release: myu.t4->c) #pragma omp target enter data map(to: myu.t4->d) #pragma omp target map(myu.t4->d[2:5]) { myu.t4->d[2]++; } #pragma omp target exit data map(release: myu.t4, myu.t4->d) assert (myu.t4->a[2] == 1); assert (myu.t4->b[2] == 3); assert (myu.t4->c[2] == 3); assert (myu.t4->d[2] == 3); delete s4; delete t4; } #endif #ifdef NONREF_COMPONENT_MEMBER_SLICE_BASEPTR template void nonref_component_member_slice_baseptr (void) { INIT_ST; U myu(s1, t1, s2, t2, &s3, &t3, s4, t4); #pragma omp target map(to: myu.t1.c) map(myu.t1.c[2:5]) { myu.t1.c[2]++; } #pragma omp target map(to: myu.t1.d) map(myu.t1.d[2:5]) { myu.t1.d[2]++; } assert (myu.t1.c[2] == 2); assert (myu.t1.d[2] == 2); #pragma omp target map(to: myu.t2.c) map(myu.t2.c[2:5]) { myu.t2.c[2]++; } #pragma omp target map(to: myu.t2.d) map(myu.t2.d[2:5]) { myu.t2.d[2]++; } assert (myu.t2.c[2] == 2); assert (myu.t2.d[2] == 2); #pragma omp target map(to: myu.t3, myu.t3->c) map(myu.t3->c[2:5]) { myu.t3->c[2]++; } #pragma omp target map(to: myu.t3, myu.t3->d) map(myu.t3->d[2:5]) { myu.t3->d[2]++; } assert (myu.t3->c[2] == 2); assert (myu.t3->d[2] == 2); #pragma omp target map(to: myu.t4, myu.t4->c) map(myu.t4->c[2:5]) { myu.t4->c[2]++; } #pragma omp target map(to: myu.t4, myu.t4->d) map(myu.t4->d[2:5]) { myu.t4->d[2]++; } assert (myu.t4->c[2] == 2); assert (myu.t4->d[2] == 2); delete s4; delete t4; } #endif #ifdef REF_COMPONENT_BASE template void ref_component_base (void) { INIT_ST; U myu_real(s1, t1, s2, t2, &s3, &t3, s4, t4); U &myu = myu_real; #pragma omp target map(myu.s1.a, myu.s1.b, myu.s1.c, myu.s1.d) { myu.s1.a++; myu.s1.b++; myu.s1.c++; myu.s1.d++; } assert (myu.s1.a == 1); assert (myu.s1.b == 1); assert (myu.s1.c == &c1 + 1); assert (myu.s1.d == &d1 + 1); #pragma omp target map(myu.s2.a, myu.s2.b, myu.s2.c, myu.s2.d) { myu.s2.a++; myu.s2.b++; myu.s2.c++; myu.s2.d++; } assert (myu.s2.a == 1); assert (myu.s2.b == 1); assert (myu.s2.c == &c2 + 1); assert (myu.s2.d == &d2 + 1); #pragma omp target map(to:myu.s3) \ map(myu.s3->a, myu.s3->b, myu.s3->c, myu.s3->d) { myu.s3->a++; myu.s3->b++; myu.s3->c++; myu.s3->d++; } assert (myu.s3->a == 1); assert (myu.s3->b == 1); assert (myu.s3->c == &c3 + 1); assert (myu.s3->d == &d3 + 1); #pragma omp target map(to:myu.s4) \ map(myu.s4->a, myu.s4->b, myu.s4->c, myu.s4->d) { myu.s4->a++; myu.s4->b++; myu.s4->c++; myu.s4->d++; } assert (myu.s4->a == 1); assert (myu.s4->b == 1); assert (myu.s4->c == &c4 + 1); assert (myu.s4->d == &d4 + 1); delete s4; delete t4; } #endif #ifdef REF_COMPONENT_MEMBER_SLICE template void ref_component_member_slice (void) { INIT_ST; U myu_real(s1, t1, s2, t2, &s3, &t3, s4, t4); U &myu = myu_real; #pragma omp target map(myu.t1.a[2:5]) { myu.t1.a[2]++; } #pragma omp target map(myu.t1.b[2:5]) { myu.t1.b[2]++; } #pragma omp target enter data map(to: myu.t1.c) #pragma omp target map(myu.t1.c[2:5]) { myu.t1.c[2]++; } #pragma omp target exit data map(release: myu.t1.c) #pragma omp target enter data map(to: myu.t1.d) #pragma omp target map(myu.t1.d[2:5]) { myu.t1.d[2]++; } #pragma omp target exit data map(release: myu.t1.d) assert (myu.t1.a[2] == 1); assert (myu.t1.b[2] == 3); assert (myu.t1.c[2] == 3); assert (myu.t1.d[2] == 3); #pragma omp target map(myu.t2.a[2:5]) { myu.t2.a[2]++; } #pragma omp target map(myu.t2.b[2:5]) { myu.t2.b[2]++; } #pragma omp target enter data map(to: myu.t2.c) #pragma omp target map(myu.t2.c[2:5]) { myu.t2.c[2]++; } #pragma omp target exit data map(release: myu.t2.c) #pragma omp target enter data map(to: myu.t2.d) #pragma omp target map(myu.t2.d[2:5]) { myu.t2.d[2]++; } #pragma omp target exit data map(release: myu.t2.d) assert (myu.t2.a[2] == 1); assert (myu.t2.b[2] == 3); assert (myu.t2.c[2] == 3); assert (myu.t2.d[2] == 3); #pragma omp target enter data map(to: myu.t3) #pragma omp target map(myu.t3->a[2:5]) { myu.t3->a[2]++; } #pragma omp target map(myu.t3->b[2:5]) { myu.t3->b[2]++; } #pragma omp target enter data map(to: myu.t3->c) #pragma omp target map(myu.t3->c[2:5]) { myu.t3->c[2]++; } #pragma omp target exit data map(release: myu.t3->c) #pragma omp target enter data map(to: myu.t3->d) #pragma omp target map(myu.t3->d[2:5]) { myu.t3->d[2]++; } #pragma omp target exit data map(release: myu.t3, myu.t3->d) assert (myu.t3->a[2] == 1); assert (myu.t3->b[2] == 3); assert (myu.t3->c[2] == 3); assert (myu.t3->d[2] == 3); #pragma omp target enter data map(to: myu.t4) #pragma omp target map(myu.t4->a[2:5]) { myu.t4->a[2]++; } #pragma omp target map(myu.t4->b[2:5]) { myu.t4->b[2]++; } #pragma omp target enter data map(to: myu.t4->c) #pragma omp target map(myu.t4->c[2:5]) { myu.t4->c[2]++; } #pragma omp target exit data map(release: myu.t4->c) #pragma omp target enter data map(to: myu.t4->d) #pragma omp target map(myu.t4->d[2:5]) { myu.t4->d[2]++; } #pragma omp target exit data map(release: myu.t4, myu.t4->d) assert (myu.t4->a[2] == 1); assert (myu.t4->b[2] == 3); assert (myu.t4->c[2] == 3); assert (myu.t4->d[2] == 3); delete s4; delete t4; } #endif #ifdef REF_COMPONENT_MEMBER_SLICE_BASEPTR template void ref_component_member_slice_baseptr (void) { INIT_ST; U myu_real(s1, t1, s2, t2, &s3, &t3, s4, t4); U &myu = myu_real; #pragma omp target map(to: myu.t1.c) map(myu.t1.c[2:5]) { myu.t1.c[2]++; } #pragma omp target map(to: myu.t1.d) map(myu.t1.d[2:5]) { myu.t1.d[2]++; } assert (myu.t1.c[2] == 2); assert (myu.t1.d[2] == 2); #pragma omp target map(to: myu.t2.c) map(myu.t2.c[2:5]) { myu.t2.c[2]++; } #pragma omp target map(to: myu.t2.d) map(myu.t2.d[2:5]) { myu.t2.d[2]++; } assert (myu.t2.c[2] == 2); assert (myu.t2.d[2] == 2); #pragma omp target map(to: myu.t3, myu.t3->c) map(myu.t3->c[2:5]) { myu.t3->c[2]++; } #pragma omp target map(to: myu.t3, myu.t3->d) map(myu.t3->d[2:5]) { myu.t3->d[2]++; } assert (myu.t3->c[2] == 2); assert (myu.t3->d[2] == 2); #pragma omp target map(to: myu.t4, myu.t4->c) map(myu.t4->c[2:5]) { myu.t4->c[2]++; } #pragma omp target map(to: myu.t4, myu.t4->d) map(myu.t4->d[2:5]) { myu.t4->d[2]++; } assert (myu.t4->c[2] == 2); assert (myu.t4->d[2] == 2); delete s4; delete t4; } #endif #ifdef PTR_COMPONENT_BASE template void ptr_component_base (void) { INIT_ST; U *myu = new U(s1, t1, s2, t2, &s3, &t3, s4, t4); #pragma omp target map(myu->s1.a, myu->s1.b, myu->s1.c, myu->s1.d) { myu->s1.a++; myu->s1.b++; myu->s1.c++; myu->s1.d++; } assert (myu->s1.a == 1); assert (myu->s1.b == 1); assert (myu->s1.c == &c1 + 1); assert (myu->s1.d == &d1 + 1); #pragma omp target map(myu->s2.a, myu->s2.b, myu->s2.c, myu->s2.d) { myu->s2.a++; myu->s2.b++; myu->s2.c++; myu->s2.d++; } assert (myu->s2.a == 1); assert (myu->s2.b == 1); assert (myu->s2.c == &c2 + 1); assert (myu->s2.d == &d2 + 1); #pragma omp target map(to:myu->s3) \ map(myu->s3->a, myu->s3->b, myu->s3->c, myu->s3->d) { myu->s3->a++; myu->s3->b++; myu->s3->c++; myu->s3->d++; } assert (myu->s3->a == 1); assert (myu->s3->b == 1); assert (myu->s3->c == &c3 + 1); assert (myu->s3->d == &d3 + 1); #pragma omp target map(to:myu->s4) \ map(myu->s4->a, myu->s4->b, myu->s4->c, myu->s4->d) { myu->s4->a++; myu->s4->b++; myu->s4->c++; myu->s4->d++; } assert (myu->s4->a == 1); assert (myu->s4->b == 1); assert (myu->s4->c == &c4 + 1); assert (myu->s4->d == &d4 + 1); delete s4; delete t4; delete myu; } #endif #ifdef PTR_COMPONENT_MEMBER_SLICE template void ptr_component_member_slice (void) { INIT_ST; U *myu = new U(s1, t1, s2, t2, &s3, &t3, s4, t4); #pragma omp target map(myu->t1.a[2:5]) { myu->t1.a[2]++; } #pragma omp target map(myu->t1.b[2:5]) { myu->t1.b[2]++; } #pragma omp target enter data map(to: myu->t1.c) #pragma omp target map(myu->t1.c[2:5]) { myu->t1.c[2]++; } #pragma omp target exit data map(release: myu->t1.c) #pragma omp target enter data map(to: myu->t1.d) #pragma omp target map(myu->t1.d[2:5]) { myu->t1.d[2]++; } #pragma omp target exit data map(release: myu->t1.d) assert (myu->t1.a[2] == 1); assert (myu->t1.b[2] == 3); assert (myu->t1.c[2] == 3); assert (myu->t1.d[2] == 3); #pragma omp target map(myu->t2.a[2:5]) { myu->t2.a[2]++; } #pragma omp target map(myu->t2.b[2:5]) { myu->t2.b[2]++; } #pragma omp target enter data map(to: myu->t2.c) #pragma omp target map(myu->t2.c[2:5]) { myu->t2.c[2]++; } #pragma omp target exit data map(release: myu->t2.c) #pragma omp target enter data map(to: myu->t2.d) #pragma omp target map(myu->t2.d[2:5]) { myu->t2.d[2]++; } #pragma omp target exit data map(release: myu->t2.d) assert (myu->t2.a[2] == 1); assert (myu->t2.b[2] == 3); assert (myu->t2.c[2] == 3); assert (myu->t2.d[2] == 3); #pragma omp target enter data map(to: myu->t3) #pragma omp target map(myu->t3->a[2:5]) { myu->t3->a[2]++; } #pragma omp target map(myu->t3->b[2:5]) { myu->t3->b[2]++; } #pragma omp target enter data map(to: myu->t3->c) #pragma omp target map(myu->t3->c[2:5]) { myu->t3->c[2]++; } #pragma omp target exit data map(release: myu->t3->c) #pragma omp target enter data map(to: myu->t3->d) #pragma omp target map(myu->t3->d[2:5]) { myu->t3->d[2]++; } #pragma omp target exit data map(release: myu->t3, myu->t3->d) assert (myu->t3->a[2] == 1); assert (myu->t3->b[2] == 3); assert (myu->t3->c[2] == 3); assert (myu->t3->d[2] == 3); #pragma omp target enter data map(to: myu->t4) #pragma omp target map(myu->t4->a[2:5]) { myu->t4->a[2]++; } #pragma omp target map(myu->t4->b[2:5]) { myu->t4->b[2]++; } #pragma omp target enter data map(to: myu->t4->c) #pragma omp target map(myu->t4->c[2:5]) { myu->t4->c[2]++; } #pragma omp target exit data map(release: myu->t4->c) #pragma omp target enter data map(to: myu->t4->d) #pragma omp target map(myu->t4->d[2:5]) { myu->t4->d[2]++; } #pragma omp target exit data map(release: myu->t4, myu->t4->d) assert (myu->t4->a[2] == 1); assert (myu->t4->b[2] == 3); assert (myu->t4->c[2] == 3); assert (myu->t4->d[2] == 3); delete s4; delete t4; delete myu; } #endif #ifdef PTR_COMPONENT_MEMBER_SLICE_BASEPTR template void ptr_component_member_slice_baseptr (void) { INIT_ST; U *myu = new U(s1, t1, s2, t2, &s3, &t3, s4, t4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t1.c) map(myu->t1.c[2:5]) { myu->t1.c[2]++; } #pragma omp target map(to: myu->t1.d) map(myu->t1.d[2:5]) { myu->t1.d[2]++; } assert (myu->t1.c[2] == 2); assert (myu->t1.d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t1.c) map(myu->t1.c[2:5]) { myu->t1.c[2]++; } #pragma omp target map(to: myu, myu->t1.d) map(myu->t1.d[2:5]) { myu->t1.d[2]++; } assert (myu->t1.c[2] == 4); assert (myu->t1.d[2] == 4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t2.c) map(myu->t2.c[2:5]) { myu->t2.c[2]++; } #pragma omp target map(to: myu->t2.d) map(myu->t2.d[2:5]) { myu->t2.d[2]++; } assert (myu->t2.c[2] == 2); assert (myu->t2.d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t2.c) map(myu->t2.c[2:5]) { myu->t2.c[2]++; } #pragma omp target map(to: myu, myu->t2.d) map(myu->t2.d[2:5]) { myu->t2.d[2]++; } assert (myu->t2.c[2] == 4); assert (myu->t2.d[2] == 4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t3, myu->t3->c) map(myu->t3->c[2:5]) { myu->t3->c[2]++; } #pragma omp target map(to: myu->t3, myu->t3->d) map(myu->t3->d[2:5]) { myu->t3->d[2]++; } assert (myu->t3->c[2] == 2); assert (myu->t3->d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t3, myu->t3->c) map(myu->t3->c[2:5]) { myu->t3->c[2]++; } #pragma omp target map(to: myu, myu->t3, myu->t3->d) map(myu->t3->d[2:5]) { myu->t3->d[2]++; } assert (myu->t3->c[2] == 4); assert (myu->t3->d[2] == 4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t4, myu->t4->c) map(myu->t4->c[2:5]) { myu->t4->c[2]++; } #pragma omp target map(to: myu->t4, myu->t4->d) map(myu->t4->d[2:5]) { myu->t4->d[2]++; } assert (myu->t4->c[2] == 2); assert (myu->t4->d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t4, myu->t4->c) map(myu->t4->c[2:5]) { myu->t4->c[2]++; } #pragma omp target map(to: myu, myu->t4, myu->t4->d) map(myu->t4->d[2:5]) { myu->t4->d[2]++; } assert (myu->t4->c[2] == 4); assert (myu->t4->d[2] == 4); delete s4; delete t4; delete myu; } #endif #ifdef REF2PTR_COMPONENT_BASE template void ref2ptr_component_base (void) { INIT_ST; U *myu_ptr = new U(s1, t1, s2, t2, &s3, &t3, s4, t4); U *&myu = myu_ptr; #pragma omp target map(myu->s1.a, myu->s1.b, myu->s1.c, myu->s1.d) { myu->s1.a++; myu->s1.b++; myu->s1.c++; myu->s1.d++; } assert (myu->s1.a == 1); assert (myu->s1.b == 1); assert (myu->s1.c == &c1 + 1); assert (myu->s1.d == &d1 + 1); #pragma omp target map(myu->s2.a, myu->s2.b, myu->s2.c, myu->s2.d) { myu->s2.a++; myu->s2.b++; myu->s2.c++; myu->s2.d++; } assert (myu->s2.a == 1); assert (myu->s2.b == 1); assert (myu->s2.c == &c2 + 1); assert (myu->s2.d == &d2 + 1); #pragma omp target map(to:myu->s3) \ map(myu->s3->a, myu->s3->b, myu->s3->c, myu->s3->d) { myu->s3->a++; myu->s3->b++; myu->s3->c++; myu->s3->d++; } assert (myu->s3->a == 1); assert (myu->s3->b == 1); assert (myu->s3->c == &c3 + 1); assert (myu->s3->d == &d3 + 1); #pragma omp target map(to:myu->s4) \ map(myu->s4->a, myu->s4->b, myu->s4->c, myu->s4->d) { myu->s4->a++; myu->s4->b++; myu->s4->c++; myu->s4->d++; } assert (myu->s4->a == 1); assert (myu->s4->b == 1); assert (myu->s4->c == &c4 + 1); assert (myu->s4->d == &d4 + 1); delete s4; delete t4; delete myu_ptr; } #endif #ifdef REF2PTR_COMPONENT_MEMBER_SLICE template void ref2ptr_component_member_slice (void) { INIT_ST; U *myu_ptr = new U(s1, t1, s2, t2, &s3, &t3, s4, t4); U *&myu = myu_ptr; #pragma omp target map(myu->t1.a[2:5]) { myu->t1.a[2]++; } #pragma omp target map(myu->t1.b[2:5]) { myu->t1.b[2]++; } #pragma omp target enter data map(to: myu->t1.c) #pragma omp target map(myu->t1.c[2:5]) { myu->t1.c[2]++; } #pragma omp target exit data map(release: myu->t1.c) #pragma omp target enter data map(to: myu->t1.d) #pragma omp target map(myu->t1.d[2:5]) { myu->t1.d[2]++; } #pragma omp target exit data map(release: myu->t1.d) assert (myu->t1.a[2] == 1); assert (myu->t1.b[2] == 3); assert (myu->t1.c[2] == 3); assert (myu->t1.d[2] == 3); #pragma omp target map(myu->t2.a[2:5]) { myu->t2.a[2]++; } #pragma omp target map(myu->t2.b[2:5]) { myu->t2.b[2]++; } #pragma omp target enter data map(to: myu->t2.c) #pragma omp target map(myu->t2.c[2:5]) { myu->t2.c[2]++; } #pragma omp target exit data map(release: myu->t2.c) #pragma omp target enter data map(to: myu->t2.d) #pragma omp target map(myu->t2.d[2:5]) { myu->t2.d[2]++; } #pragma omp target exit data map(release: myu->t2.d) assert (myu->t2.a[2] == 1); assert (myu->t2.b[2] == 3); assert (myu->t2.c[2] == 3); assert (myu->t2.d[2] == 3); #pragma omp target enter data map(to: myu->t3) #pragma omp target map(myu->t3->a[2:5]) { myu->t3->a[2]++; } #pragma omp target map(myu->t3->b[2:5]) { myu->t3->b[2]++; } #pragma omp target enter data map(to: myu->t3->c) #pragma omp target map(myu->t3->c[2:5]) { myu->t3->c[2]++; } #pragma omp target exit data map(release: myu->t3->c) #pragma omp target enter data map(to: myu->t3->d) #pragma omp target map(myu->t3->d[2:5]) { myu->t3->d[2]++; } #pragma omp target exit data map(release: myu->t3, myu->t3->d) assert (myu->t3->a[2] == 1); assert (myu->t3->b[2] == 3); assert (myu->t3->c[2] == 3); assert (myu->t3->d[2] == 3); #pragma omp target enter data map(to: myu->t4) #pragma omp target map(myu->t4->a[2:5]) { myu->t4->a[2]++; } #pragma omp target map(myu->t4->b[2:5]) { myu->t4->b[2]++; } #pragma omp target enter data map(to: myu->t4->c) #pragma omp target map(myu->t4->c[2:5]) { myu->t4->c[2]++; } #pragma omp target exit data map(release: myu->t4->c) #pragma omp target enter data map(to: myu->t4->d) #pragma omp target map(myu->t4->d[2:5]) { myu->t4->d[2]++; } #pragma omp target exit data map(release: myu->t4, myu->t4->d) assert (myu->t4->a[2] == 1); assert (myu->t4->b[2] == 3); assert (myu->t4->c[2] == 3); assert (myu->t4->d[2] == 3); delete s4; delete t4; delete myu_ptr; } #endif #ifdef REF2PTR_COMPONENT_MEMBER_SLICE_BASEPTR template void ref2ptr_component_member_slice_baseptr (void) { INIT_ST; U *myu_ptr = new U(s1, t1, s2, t2, &s3, &t3, s4, t4); U *&myu = myu_ptr; /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t1.c) map(myu->t1.c[2:5]) { myu->t1.c[2]++; } #pragma omp target map(to: myu->t1.d) map(myu->t1.d[2:5]) { myu->t1.d[2]++; } assert (myu->t1.c[2] == 2); assert (myu->t1.d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t1.c) map(myu->t1.c[2:5]) { myu->t1.c[2]++; } #pragma omp target map(to: myu, myu->t1.d) map(myu->t1.d[2:5]) { myu->t1.d[2]++; } assert (myu->t1.c[2] == 4); assert (myu->t1.d[2] == 4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t2.c) map(myu->t2.c[2:5]) { myu->t2.c[2]++; } #pragma omp target map(to: myu->t2.d) map(myu->t2.d[2:5]) { myu->t2.d[2]++; } assert (myu->t2.c[2] == 2); assert (myu->t2.d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t2.c) map(myu->t2.c[2:5]) { myu->t2.c[2]++; } #pragma omp target map(to: myu, myu->t2.d) map(myu->t2.d[2:5]) { myu->t2.d[2]++; } assert (myu->t2.c[2] == 4); assert (myu->t2.d[2] == 4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t3, myu->t3->c) map(myu->t3->c[2:5]) { myu->t3->c[2]++; } #pragma omp target map(to: myu->t3, myu->t3->d) map(myu->t3->d[2:5]) { myu->t3->d[2]++; } assert (myu->t3->c[2] == 2); assert (myu->t3->d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t3, myu->t3->c) map(myu->t3->c[2:5]) { myu->t3->c[2]++; } #pragma omp target map(to: myu, myu->t3, myu->t3->d) map(myu->t3->d[2:5]) { myu->t3->d[2]++; } assert (myu->t3->c[2] == 4); assert (myu->t3->d[2] == 4); /* Implicit firstprivate 'myu'. */ #pragma omp target map(to: myu->t4, myu->t4->c) map(myu->t4->c[2:5]) { myu->t4->c[2]++; } #pragma omp target map(to: myu->t4, myu->t4->d) map(myu->t4->d[2:5]) { myu->t4->d[2]++; } assert (myu->t4->c[2] == 2); assert (myu->t4->d[2] == 2); /* Explicitly-mapped 'myu'. */ #pragma omp target map(to: myu, myu->t4, myu->t4->c) map(myu->t4->c[2:5]) { myu->t4->c[2]++; } #pragma omp target map(to: myu, myu->t4, myu->t4->d) map(myu->t4->d[2:5]) { myu->t4->d[2]++; } assert (myu->t4->c[2] == 4); assert (myu->t4->d[2] == 4); delete s4; delete t4; delete myu_ptr; } #endif int main (int argc, char *argv[]) { #ifdef MAP_DECLS map_decls<4> (); #endif #ifdef NONREF_DECL_BASE nonref_decl_base (); #endif #ifdef REF_DECL_BASE ref_decl_base (); #endif #ifdef PTR_DECL_BASE ptr_decl_base (); #endif #ifdef REF2PTR_DECL_BASE ref2ptr_decl_base (); #endif #ifdef ARRAY_DECL_BASE array_decl_base (); #endif #ifdef REF2ARRAY_DECL_BASE ref2array_decl_base (); #endif #ifdef PTR_OFFSET_DECL_BASE ptr_offset_decl_base (); #endif #ifdef REF2PTR_OFFSET_DECL_BASE ref2ptr_offset_decl_base (); #endif #ifdef MAP_SECTIONS map_sections (); #endif #ifdef NONREF_DECL_MEMBER_SLICE nonref_decl_member_slice (); #endif #ifdef NONREF_DECL_MEMBER_SLICE_BASEPTR nonref_decl_member_slice_baseptr (); #endif #ifdef REF_DECL_MEMBER_SLICE ref_decl_member_slice (); #endif #ifdef REF_DECL_MEMBER_SLICE_BASEPTR ref_decl_member_slice_baseptr (); #endif #ifdef PTR_DECL_MEMBER_SLICE ptr_decl_member_slice (); #endif #ifdef PTR_DECL_MEMBER_SLICE_BASEPTR ptr_decl_member_slice_baseptr (); #endif #ifdef REF2PTR_DECL_MEMBER_SLICE ref2ptr_decl_member_slice (); #endif #ifdef REF2PTR_DECL_MEMBER_SLICE_BASEPTR ref2ptr_decl_member_slice_baseptr (); #endif #ifdef ARRAY_DECL_MEMBER_SLICE array_decl_member_slice (); #endif #ifdef ARRAY_DECL_MEMBER_SLICE_BASEPTR array_decl_member_slice_baseptr (); #endif #ifdef REF2ARRAY_DECL_MEMBER_SLICE ref2array_decl_member_slice (); #endif #ifdef REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR ref2array_decl_member_slice_baseptr (); #endif #ifdef PTR_OFFSET_DECL_MEMBER_SLICE ptr_offset_decl_member_slice (); #endif #ifdef PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR ptr_offset_decl_member_slice_baseptr (); #endif #ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE ref2ptr_offset_decl_member_slice (); #endif #ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR ref2ptr_offset_decl_member_slice_baseptr (); #endif #ifdef PTRARRAY_DECL_MEMBER_SLICE ptrarray_decl_member_slice (); #endif #ifdef PTRARRAY_DECL_MEMBER_SLICE_BASEPTR ptrarray_decl_member_slice_baseptr (); #endif #ifdef REF2PTRARRAY_DECL_MEMBER_SLICE ref2ptrarray_decl_member_slice (); #endif #ifdef REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR ref2ptrarray_decl_member_slice_baseptr (); #endif #ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE ptrptr_offset_decl_member_slice (); #endif #ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR ptrptr_offset_decl_member_slice_baseptr (); #endif #ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE ref2ptrptr_offset_decl_member_slice (); #endif #ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR ref2ptrptr_offset_decl_member_slice_baseptr (); #endif #ifdef NONREF_COMPONENT_BASE nonref_component_base (); #endif #ifdef NONREF_COMPONENT_MEMBER_SLICE nonref_component_member_slice (); #endif #ifdef NONREF_COMPONENT_MEMBER_SLICE_BASEPTR nonref_component_member_slice_baseptr (); #endif #ifdef REF_COMPONENT_BASE ref_component_base (); #endif #ifdef REF_COMPONENT_MEMBER_SLICE ref_component_member_slice (); #endif #ifdef REF_COMPONENT_MEMBER_SLICE_BASEPTR ref_component_member_slice_baseptr (); #endif #ifdef PTR_COMPONENT_BASE ptr_component_base (); #endif #ifdef PTR_COMPONENT_MEMBER_SLICE ptr_component_member_slice (); #endif #ifdef PTR_COMPONENT_MEMBER_SLICE_BASEPTR ptr_component_member_slice_baseptr (); #endif #ifdef REF2PTR_COMPONENT_BASE ref2ptr_component_base (); #endif #ifdef REF2PTR_COMPONENT_MEMBER_SLICE ref2ptr_component_member_slice (); #endif #ifdef REF2PTR_COMPONENT_MEMBER_SLICE_BASEPTR ref2ptr_component_member_slice_baseptr (); #endif return 0; }