blob: a96cf3cffb8091d838919a2a055c6a2a17324f79 [file]
// { dg-do run { target offload_device_nonshared_as } }
#include <assert.h>
#include <string.h>
template<typename T>
struct C {
T *&aptr;
C(T *&aptr_1) : aptr(aptr_1)
{
}
};
template<typename T>
void foo (T *c)
{
#pragma omp target enter data map(to: c->aptr, c->aptr[:100])
#pragma omp target
{
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
c->aptr[i * 10 + j] = i + j;
}
#pragma omp target update from(([10][10]) c->aptr[2:3:2][7:3])
for (int i = 2; i < 8; i += 2)
for (int j = 7; j < 10; j++)
assert (c->aptr[i * 10 + j] == i + j);
#pragma omp target exit data map(delete: c->aptr, c->aptr[:100])
}
int main()
{
float *arr = new float[100];
C<float> cvar(arr);
memset (arr, 0, 100 * sizeof (float));
#pragma omp target enter data map(to: cvar.aptr, cvar.aptr[:100])
#pragma omp target
{
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
cvar.aptr[i * 10 + j] = i + j;
}
#pragma omp target update from(([10][10]) cvar.aptr[4:3][4:3])
for (int i = 4; i < 7; i++)
for (int j = 4; j < 7; j++)
assert (cvar.aptr[i * 10 + j] == i + j);
#pragma omp target exit data map(delete: cvar.aptr, cvar.aptr[:100])
foo<C<float> > (&cvar);
delete[] arr;
return 0;
}