| extern void abort (void); |
| struct S { int e, f; }; |
| |
| void |
| foo (int n) |
| { |
| int a[4] = { 0, 1, 2, 3 }, b[n], c = 4; |
| struct S d = { 5, 6 }; |
| int *p = a + 1, i, err; |
| for (i = 0; i < n; i++) |
| b[i] = 9 + i; |
| #pragma omp target data map(to:a) |
| #pragma omp target data use_device_ptr(p) map(from:err) |
| #pragma omp target is_device_ptr(p) private(i) map(from:err) |
| { |
| err = 0; |
| for (i = 0; i < 4; i++) |
| if (p[i - 1] != i) |
| err = 1; |
| } |
| if (err) |
| abort (); |
| for (i = 0; i < 4; i++) |
| a[i] = 23 + i; |
| #pragma omp target data map(to:a) |
| #pragma omp target data use_device_addr(a) map(from:err) |
| #pragma omp target is_device_ptr(a) private(i) map(from:err) |
| { |
| err = 0; |
| for (i = 0; i < 4; i++) |
| if (a[i] != 23 + i) |
| err = 1; |
| } |
| if (err) |
| abort (); |
| #pragma omp target data map(to:b) |
| #pragma omp target data use_device_addr(b) map(from:err) |
| #pragma omp target is_device_ptr(b) private(i) map(from:err) |
| { |
| err = 0; |
| for (i = 0; i < 4; i++) |
| if (b[i] != 9 + i) |
| err = 1; |
| } |
| if (err) |
| abort (); |
| #pragma omp target data map(to:c) |
| #pragma omp target data use_device_addr(c) map(from:err) |
| { |
| int *q = &c; |
| #pragma omp target is_device_ptr(q) map(from:err) |
| { |
| err = *q != 4; |
| } |
| } |
| if (err) |
| abort (); |
| #pragma omp target data map(to:d) |
| #pragma omp target data use_device_addr(d) map(from:err) |
| { |
| struct S *r = &d; |
| #pragma omp target is_device_ptr(r) map(from:err) |
| { |
| err = r->e != 5 || r->f != 6; |
| } |
| } |
| if (err) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| foo (9); |
| return 0; |
| } |