blob: bc3cc8f3da2f7ba719ee90ae628721f2c2db7f0a [file] [log] [blame]
/* PR c++/110347 */
#include <omp.h>
#define N 30
struct t {
int *A;
void f (int dev);
};
void
t::f (int dev)
{
int *ptr;
int B[N];
for (int i = 0; i < N; i++)
B[i] = 1 + i;
ptr = A = (int *) omp_target_alloc (sizeof (int) * N, dev);
omp_target_memcpy (A, B, sizeof (int) * N, 0, 0, dev, omp_initial_device);
#pragma omp target is_device_ptr (A) device(dev)
{
for (int i = 0; i < N; i++)
if (A[i] != 1 + i)
__builtin_abort ();
for (int i = 0; i < N; i++)
A[i] = (-2-i)*10;
A = (int *) 0x12345;
}
if (ptr != A)
__builtin_abort ();
#pragma omp target is_device_ptr (A) device(dev)
{
for (int i = 0; i < N; i++)
if (A[i] != (-2-i)*10)
__builtin_abort ();
for (int i = 0; i < N; i++)
A[i] = (3+i)*11;
A = (int *) 0x12345;
}
if (ptr != A)
__builtin_abort ();
int *C = (int *) __builtin_malloc (sizeof(int)*N);
omp_target_memcpy (C, A, sizeof (int) * N, 0, 0, omp_initial_device, dev);
for (int i = 0; i < N; i++)
if (C[i] != (3+i)*11)
__builtin_abort ();
__builtin_free (C);
omp_target_free (A, dev);
}
template <typename T>
struct tt {
T *D;
void g (int dev);
};
template <typename T>
void
tt<T>::g (int dev)
{
T *ptr;
T E[N];
for (int i = 0; i < N; i++)
E[i] = 1 + i;
ptr = D = (T *) omp_target_alloc (sizeof (T) * N, dev);
omp_target_memcpy (D, E, sizeof (T) * N, 0, 0, dev, omp_initial_device);
#pragma omp target is_device_ptr (D) device(dev)
{
for (int i = 0; i < N; i++)
if (D[i] != 1 + i)
__builtin_abort ();
for (int i = 0; i < N; i++)
D[i] = (-2-i)*10;
D = (T *) 0x12345;
}
if (ptr != D)
__builtin_abort ();
#pragma omp target is_device_ptr (D) device(dev)
{
for (int i = 0; i < N; i++)
if (D[i] != (-2-i)*10)
__builtin_abort ();
for (int i = 0; i < N; i++)
D[i] = (3+i)*11;
D = (T *) 0x12345;
}
if (ptr != D)
__builtin_abort ();
T *F = (T *) __builtin_malloc (sizeof(T)*N);
omp_target_memcpy (F, D, sizeof (T) * N, 0, 0, omp_initial_device, dev);
for (int i = 0; i < N; i++)
if (F[i] != (3+i)*11)
__builtin_abort ();
__builtin_free (F);
omp_target_free (D, dev);
}
void
foo ()
{
struct t x;
for (int dev = 0; dev <= omp_get_num_devices (); dev++)
x.f (dev);
}
void
bar ()
{
struct tt<int> y;
for (int dev = 0; dev <= omp_get_num_devices (); dev++)
y.g (dev);
}
int
main ()
{
foo ();
bar ();
}