| extern "C" void abort (void); |
| struct S { int s, t; }; |
| |
| void |
| foo (int &x, int &y, S &u, S &v, double &s, double &t) |
| { |
| int err = 0, i; |
| int a[y - 2], b[y - 2]; |
| int (&c)[y - 2] = a, (&d)[y - 2] = b; |
| for (i = 0; i < y - 2; i++) |
| { |
| c[i] = i; |
| d[i] = 3 + i; |
| } |
| #pragma omp target private (x, u, s, c, i) firstprivate (y, v, t, d) map(from:err) |
| { |
| x = y; |
| u = v; |
| s = t; |
| for (i = 0; i < y - 2; i++) |
| c[i] = d[i]; |
| err = (x != 6 || y != 6 |
| || u.s != 9 || u.t != 10 || v.s != 9 || v.t != 10 |
| || s != 12.5 || t != 12.5); |
| for (i = 0; i < y - 2; i++) |
| if (d[i] != 3 + i || c[i] != 3 + i) |
| err = 1; |
| else |
| { |
| c[i] += 2 * i; |
| d[i] += i; |
| } |
| x += 1; |
| y += 2; |
| u.s += 3; |
| v.t += 4; |
| s += 2.5; |
| t += 3.0; |
| if (x != 7 || y != 8 |
| || u.s != 12 || u.t != 10 || v.s != 9 || v.t != 14 |
| || s != 15.0 || t != 15.5) |
| err = 1; |
| for (i = 0; i < y - 4; i++) |
| if (d[i] != 3 + 2 * i || c[i] != 3 + 3 * i) |
| err = 1; |
| } |
| if (err || x != 5 || y != 6 |
| || u.s != 7 || u.t != 8 || v.s != 9 || v.t != 10 |
| || s != 11.5 || t != 12.5) |
| abort (); |
| for (i = 0; i < y - 2; i++) |
| if (d[i] != 3 + i || c[i] != i) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| int x = 5, y = 6; |
| S u = { 7, 8 }, v = { 9, 10 }; |
| double s = 11.5, t = 12.5; |
| foo (x, y, u, v, s, t); |
| return 0; |
| } |