| /* 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 (); | |
| } |