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