blob: 196029ac1868f970185e673e230dc7ac22e9c94a [file] [log] [blame] [edit]
// { dg-do run }
#include <cstring>
#include <cassert>
#define MAP_DECLS
#define NONREF_DECL_BASE
#define REF_DECL_BASE
#define PTR_DECL_BASE
#define REF2PTR_DECL_BASE
#define ARRAY_DECL_BASE
// Needs map clause "lvalue"-parsing support.
//#define REF2ARRAY_DECL_BASE
#define PTR_OFFSET_DECL_BASE
// Needs map clause "lvalue"-parsing support.
//#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
// Needs map clause "lvalue"-parsing support.
//#define REF2ARRAY_DECL_MEMBER_SLICE
//#define REF2ARRAY_DECL_MEMBER_SLICE_BASEPTR
#define PTR_OFFSET_DECL_MEMBER_SLICE
#define PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
// Needs map clause "lvalue"-parsing support.
//#define REF2PTR_OFFSET_DECL_MEMBER_SLICE
//#define REF2PTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
#define PTRARRAY_DECL_MEMBER_SLICE
#define PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
// Needs map clause "lvalue"-parsing support.
//#define REF2PTRARRAY_DECL_MEMBER_SLICE
//#define REF2PTRARRAY_DECL_MEMBER_SLICE_BASEPTR
#define PTRPTR_OFFSET_DECL_MEMBER_SLICE
#define PTRPTR_OFFSET_DECL_MEMBER_SLICE_BASEPTR
// Needs map clause "lvalue"-parsing support.
//#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
void
map_decls (void)
{
int x = 0;
int &y = x;
int arr[4];
int (&arrref)[4] = 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
struct S {
int a;
int &b;
int *c;
int *&d;
int e[4];
int (&f)[4];
S(int a1, int &b1, int *c1, int *&d1) :
a(a1), b(b1), c(c1), d(d1), f(e)
{
memset (e, 0, sizeof e);
}
};
#ifdef NONREF_DECL_BASE
void
nonref_decl_base (void)
{
int 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
void
ref_decl_base (void)
{
int 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
void
ptr_decl_base (void)
{
int 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
void
ref2ptr_decl_base (void)
{
int 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
void
array_decl_base (void)
{
int 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
void
ref2array_decl_base (void)
{
int 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
void
ptr_offset_decl_base (void)
{
int 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
void
ref2ptr_offset_decl_base (void)
{
int 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
void
map_sections (void)
{
int arr[10];
int *ptr;
int (&arrref)[10] = arr;
int *&ptrref = ptr;
ptr = new int[10];
memset (ptr, 0, sizeof (int) * 10);
memset (arr, 0, sizeof (int) * 10);
#pragma omp target map(arr[0:10])
{
arr[2]++;
}
#pragma omp target map(ptr[0:10])
{
ptr[2]++;
}
#pragma omp target map(arrref[0:10])
{
arrref[2]++;
}
#pragma omp target map(ptrref[0:10])
{
ptrref[2]++;
}
assert (arr[2] == 2);
assert (ptr[2] == 2);
delete ptr;
}
#endif
struct T {
int a[10];
int (&b)[10];
int *c;
int *&d;
T(int (&b1)[10], int *c1, int *&d1) : b(b1), c(c1), d(d1)
{
memset (a, 0, sizeof a);
}
};
#ifdef NONREF_DECL_MEMBER_SLICE
void
nonref_decl_member_slice (void)
{
int c[10];
int *d = &c[0];
T myt(c, &c[0], d);
memset (c, 0, sizeof c);
#pragma omp target map(myt.a[0:10])
{
myt.a[2]++;
}
#pragma omp target map(myt.b[0:10])
{
myt.b[2]++;
}
#pragma omp target enter data map(to: myt.c)
#pragma omp target map(myt.c[0:10])
{
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:10])
{
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
void
nonref_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt.c[2]++;
}
#pragma omp target map(to:myt.d) map(myt.d[0:10])
{
myt.d[2]++;
}
assert (myt.c[2] == 2);
assert (myt.d[2] == 2);
}
#endif
#ifdef REF_DECL_MEMBER_SLICE
void
ref_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt.a[2]++;
}
#pragma omp target map(myt.b[0:10])
{
myt.b[2]++;
}
#pragma omp target enter data map(to: myt.c)
#pragma omp target map(myt.c[0:10])
{
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:10])
{
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
void
ref_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt.c[2]++;
}
#pragma omp target map(to:myt.d) map(myt.d[0:10])
{
myt.d[2]++;
}
assert (myt.c[2] == 2);
assert (myt.d[2] == 2);
}
#endif
#ifdef PTR_DECL_MEMBER_SLICE
void
ptr_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt->a[2]++;
}
#pragma omp target map(myt->b[0:10])
{
myt->b[2]++;
}
#pragma omp target enter data map(to: myt->c)
#pragma omp target map(myt->c[0:10])
{
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:10])
{
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
void
ptr_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt->c[2]++;
}
#pragma omp target map(to:myt->d) map(myt->d[0:10])
{
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:10])
{
myt->c[2]++;
}
#pragma omp target map(to:myt) map(to:myt->d) map(myt->d[0:10])
{
myt->d[2]++;
}
assert (myt->c[2] == 4);
assert (myt->d[2] == 4);
}
#endif
#ifdef REF2PTR_DECL_MEMBER_SLICE
void
ref2ptr_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt->a[2]++;
}
#pragma omp target map(myt->b[0:10])
{
myt->b[2]++;
}
#pragma omp target enter data map(to: myt->c)
#pragma omp target map(myt->c[0:10])
{
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:10])
{
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
void
ref2ptr_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt->c[2]++;
}
#pragma omp target map(to:myt->d) map(myt->d[0:10])
{
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:10])
{
myt->c[2]++;
}
#pragma omp target map(to:myt) map(to:myt->d) map(myt->d[0:10])
{
myt->d[2]++;
}
assert (myt->c[2] == 4);
assert (myt->d[2] == 4);
}
#endif
#ifdef ARRAY_DECL_MEMBER_SLICE
void
array_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2].a[2]++;
}
#pragma omp target map(myt[2].b[0:10])
{
myt[2].b[2]++;
}
#pragma omp target enter data map(to: myt[2].c)
#pragma omp target map(myt[2].c[0:10])
{
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:10])
{
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
void
array_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2].c[2]++;
}
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:10])
{
myt[2].d[2]++;
}
assert (myt[2].c[2] == 2);
assert (myt[2].d[2] == 2);
}
#endif
#ifdef REF2ARRAY_DECL_MEMBER_SLICE
void
ref2array_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2].a[2]++;
}
#pragma omp target map(myt[2].b[0:10])
{
myt[2].b[2]++;
}
#pragma omp target enter data map(to: myt[2].c)
#pragma omp target map(myt[2].c[0:10])
{
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:10])
{
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
void
ref2array_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2].c[2]++;
}
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:10])
{
myt[2].d[2]++;
}
assert (myt[2].c[2] == 2);
assert (myt[2].d[2] == 2);
}
#endif
#ifdef PTR_OFFSET_DECL_MEMBER_SLICE
void
ptr_offset_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2].a[2]++;
}
#pragma omp target map(myt[2].b[0:10])
{
myt[2].b[2]++;
}
#pragma omp target enter data map(to: myt[2].c)
#pragma omp target map(myt[2].c[0:10])
{
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:10])
{
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
void
ptr_offset_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2].c[2]++;
}
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:10])
{
myt[2].d[2]++;
}
/* Explicit 'to'-mapped 'myt'. */
#pragma omp target map(to:myt) map(to:myt[2].c) map(myt[2].c[0:10])
{
myt[2].c[2]++;
}
#pragma omp target map(to:myt) map(to:myt[2].d) map(myt[2].d[0:10])
{
myt[2].d[2]++;
}
assert (myt[2].c[2] == 4);
assert (myt[2].d[2] == 4);
}
#endif
#ifdef REF2PTR_OFFSET_DECL_MEMBER_SLICE
void
ref2ptr_offset_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2].a[2]++;
}
#pragma omp target map(myt[2].b[0:10])
{
myt[2].b[2]++;
}
#pragma omp target enter data map(to: myt[2].c)
#pragma omp target map(myt[2].c[0:10])
{
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:10])
{
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
void
ref2ptr_offset_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2].c[2]++;
}
#pragma omp target map(to:myt[2].d) map(myt[2].d[0:10])
{
myt[2].d[2]++;
}
/* Explicit 'to'-mapped 'myt'. */
#pragma omp target map(to:myt) map(to:myt[2].c) map(myt[2].c[0:10])
{
myt[2].c[2]++;
}
#pragma omp target map(to:myt) map(to:myt[2].d) map(myt[2].d[0:10])
{
myt[2].d[2]++;
}
assert (myt[2].c[2] == 4);
assert (myt[2].d[2] == 4);
}
#endif
#ifdef PTRARRAY_DECL_MEMBER_SLICE
void
ptrarray_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2]->a[2]++;
}
#pragma omp target map(myt[2]->b[0:10])
{
myt[2]->b[2]++;
}
#pragma omp target enter data map(to: myt[2]->c)
#pragma omp target map(myt[2]->c[0:10])
{
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:10])
{
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
void
ptrarray_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to: myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
// One element of 'myt'
#pragma omp target map(to:myt[2], myt[2]->c) map(myt[2]->c[0:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
// Explicit map of all of 'myt'
#pragma omp target map(to:myt, myt[2]->c) map(myt[2]->c[0:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt, myt[2]->d) map(myt[2]->d[0:10])
{
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:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt[1:3], myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
assert (myt[2]->c[2] == 8);
assert (myt[2]->d[2] == 8);
}
#endif
#ifdef REF2PTRARRAY_DECL_MEMBER_SLICE
void
ref2ptrarray_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2]->a[2]++;
}
#pragma omp target map(myt[2]->b[0:10])
{
myt[2]->b[2]++;
}
#pragma omp target enter data map(to: myt[2]->c)
#pragma omp target map(myt[2]->c[0:10])
{
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:10])
{
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
void
ref2ptrarray_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
#pragma omp target map(to:myt, myt[2]->c) map(myt[2]->c[0:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt, myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
assert (myt[2]->c[2] == 4);
assert (myt[2]->d[2] == 4);
}
#endif
#ifdef PTRPTR_OFFSET_DECL_MEMBER_SLICE
void
ptrptr_offset_decl_member_slice (void)
{
int c[10];
int *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:10])
{
myt[2]->a[2]++;
}
#pragma omp target map(myt[2]->b[0:10])
{
myt[2]->b[2]++;
}
#pragma omp target enter data map(to: myt[2]->c)
#pragma omp target map(myt[2]->c[0:10])
{
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:10])
{
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
void
ptrptr_offset_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[3]->c[2]++;
}
#pragma omp target map(to:myt[3], myt[3]->d) map(myt[3]->d[0:10])
{
myt[3]->d[2]++;
}
#pragma omp target map(to:myt, myt[3], myt[3]->c) map(myt[3]->c[0:10])
{
myt[3]->c[2]++;
}
#pragma omp target map(to:myt, myt[3], myt[3]->d) map(myt[3]->d[0:10])
{
myt[3]->d[2]++;
}
assert (myt[3]->c[2] == 4);
assert (myt[3]->d[2] == 4);
}
#endif
#ifdef REF2PTRPTR_OFFSET_DECL_MEMBER_SLICE
void
ref2ptrptr_offset_decl_member_slice (void)
{
int c[10];
int *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 enter data map(to: myt[0:3])
#pragma omp target map(myt[2]->a[0:10])
{
myt[2]->a[2]++;
}
#pragma omp target map(myt[2]->b[0:10])
{
myt[2]->b[2]++;
}
#pragma omp target enter data map(to:myt[2]->c)
#pragma omp target map(myt[2]->c[0:10])
{
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:10])
{
myt[2]->d[2]++;
}
#pragma omp target exit data map(release: 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
void
ref2ptrptr_offset_decl_member_slice_baseptr (void)
{
int c[10];
int *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:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt[2], myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
#pragma omp target map(to:myt, myt[2], myt[2]->c) map(myt[2]->c[0:10])
{
myt[2]->c[2]++;
}
#pragma omp target map(to:myt, myt[2], myt[2]->d) map(myt[2]->d[0:10])
{
myt[2]->d[2]++;
}
assert (myt[2]->c[2] == 4);
assert (myt[2]->d[2] == 4);
}
#endif
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) \
int a##N = 0, b##N = 0, c##N = 0, d##N = 0; \
int *d##N##ptr = &d##N; \
S s##N(a##N, b##N, &c##N, d##N##ptr)
#define INIT_T(N) \
int arr##N[10]; \
int *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); \
int a4 = 0, b4 = 0, c4 = 0, d4 = 0; \
int *d4ptr = &d4; \
S *s4 = new S(a4, b4, &c4, d4ptr); \
int arr4[10]; \
int *ptr4 = &arr4[0]; \
T *t4 = new T(arr4, &arr4[0], ptr4); \
memset (arr4, 0, sizeof arr4)
#ifdef NONREF_COMPONENT_BASE
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
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
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
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
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
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
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
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
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
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
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
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 ();
#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;
}