/* { dg-do run } */ /* PR middle-end/116107 */ #include int arr[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; #pragma omp declare target link(arr) #pragma omp begin declare target void f(int *res) { __builtin_memcpy (res, &arr[5], sizeof(int)*10); } void g(int *res) { __builtin_memcpy (res, &arr[3], sizeof(int)*10); } #pragma omp end declare target int main() { int res[10], res2; for (int dev = 0; dev < omp_get_num_devices(); dev++) { __builtin_memset (res, 0, sizeof (res)); res2 = 99; #pragma omp target enter data map(arr[5:10]) device(dev) #pragma omp target map(from: res) device(dev) f (res); #pragma omp target map(from: res2) device(dev) res2 = arr[5]; if (res2 != 6) __builtin_abort (); for (int i = 0; i < 10; i++) if (res[i] != 6 + i) __builtin_abort (); #pragma omp target exit data map(release:arr[5:10]) device(dev) for (int i = 0; i < 15; i++) arr[i] *= 10; __builtin_memset (res, 0, sizeof (res)); #pragma omp target enter data map(arr[3:10]) device(dev) #pragma omp target map(from: res) device(dev) g (res); for (int i = 0; i < 10; i++) if (res[i] != (4 + i)*10) __builtin_abort (); for (int i = 0; i < 15; i++) /* Reset. */ arr[i] /= 10; } return 0; }