blob: 29345ca4264c0a319d47f197b80da6b84d7ab55e [file]
// { dg-do run { target offload_device_nonshared_as } }
#include <assert.h>
#include <string.h>
#define N 10
template<typename T>
void foo ()
{
T *tptr = new T[N * N * N];
memset (tptr, 0, N * N * N * sizeof (T));
#pragma omp target enter data map(to: tptr[0:N*N*N])
#pragma omp target
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
tptr[i * N * N + 4 * N + j] = 2 * (i + j);
}
/* An array ref between two array sections. */
#pragma omp target update from(([N][N][N]) tptr[4:3][4][5:3])
for (int i = 4; i < 7; i++)
for (int j = 5; j < 8; j++)
assert (tptr[i * N * N + 4 * N + j] == 2 * (i + j));
memset (tptr, 0, N * N * N * sizeof (T));
for (int i = 0; i < N; i++)
tptr[2 * N * N + i * N + 4] = 4 * i;
/* Array section between two array refs. */
#pragma omp target update to(([N][N][N]) tptr[2][3:6][4])
#pragma omp target exit data map(from: tptr[0:N*N*N])
for (int i = 3; i < 9; i++)
assert (tptr[2 * N * N + i * N + 4] == 4 * i);
#pragma omp target exit data map(delete: tptr[0:N*N*N])
delete[] tptr;
}
int main ()
{
int *iptr = new int[N * N * N];
memset (iptr, 0, N * N * N * sizeof (int));
#pragma omp target enter data map(to: iptr[0:N*N*N])
#pragma omp target
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
iptr[i * N * N + 4 * N + j] = i + j;
}
/* An array ref between two array sections. */
#pragma omp target update from(([N][N][N]) iptr[2:3][4][6:3])
for (int i = 2; i < 5; i++)
for (int j = 6; j < 9; j++)
assert (iptr[i * N * N + 4 * N + j] == i + j);
memset (iptr, 0, N * N * N * sizeof (int));
for (int i = 0; i < N; i++)
iptr[2 * N * N + i * N + 4] = 3 * i;
/* Array section between two array refs. */
#pragma omp target update to(([N][N][N]) iptr[2][3:6][4])
#pragma omp target exit data map(from: iptr[0:N*N*N])
for (int i = 3; i < 9; i++)
assert (iptr[2 * N * N + i * N + 4] == 3 * i);
delete[] iptr;
foo<unsigned long> ();
return 0;
}