extern "C" void abort (); int x; __attribute__((noinline, noclone)) void foo (int &a, int (&b)[10], short &c, long (&d)[5], int n) { int err; int &t = x; int y[n + 1]; int (&z)[n + 1] = y; for (int i = 0; i < n + 1; i++) z[i] = i + 27; #pragma omp target enter data map (to: z, c) map (alloc: b, t) #pragma omp target update to (b, t) #pragma omp target map (tofrom: a, d) map (from: b, c) map (alloc: t, z) map (from: err) { err = a++ != 7; for (int i = 0; i < 10; i++) { err |= b[i] != 10 - i; b[i] = i - 16; if (i >= 6) continue; err |= z[i] != i + 27; z[i] = 2 * i + 9; if (i == 5) continue; err |= d[i] != 12L + i; d[i] = i + 7; } err |= c != 25; c = 142; err |= t != 8; t = 19; } if (err) abort (); #pragma omp target update from (z, c) #pragma omp target exit data map (from: b, t) map (release: z, c) if (a != 8 || c != 142 || t != 19) abort (); a = 29; c = 149; t = 15; for (int i = 0; i < 10; i++) { if (b[i] != i - 16) abort (); b[i] = i ^ 1; if (i >= 6) continue; if (z[i] != 2 * i + 9) abort (); z[i]++; if (i == 5) continue; if (d[i] != i + 7) abort (); d[i] = 7 - i; } #pragma omp target defaultmap(tofrom: scalar) { err = a++ != 29; for (int i = 0; i < 10; i++) { err |= b[i] != i ^ 1; b[i] = i + 5; if (i >= 6) continue; err |= z[i] != 2 * i + 10; z[i] = 9 - 3 * i; if (i == 5) continue; err |= d[i] != 7L - i; d[i] = i; } err |= c != 149; c = -2; err |= t != 15; t = 155; } if (err || a != 30 || c != -2 || t != 155) abort (); for (int i = 0; i < 10; i++) { if (b[i] != i + 5) abort (); if (i >= 6) continue; if (z[i] != 9 - 3 * i) abort (); z[i]++; if (i == 5) continue; if (d[i] != i) abort (); } #pragma omp target data map (alloc: z) { #pragma omp target update to (z) #pragma omp target map(from: err) { err = 0; for (int i = 0; i < 6; i++) if (z[i] != 10 - 3 * i) err = 1; else z[i] = i; } if (err) abort (); #pragma omp target update from (z) } for (int i = 0; i < 6; i++) if (z[i] != i) abort (); } int main () { int a = 7; int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; short c = 25; long d[5] = { 12, 13, 14, 15, 16 }; x = 8; foo (a, b, c, d, 5); }