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; }