|  | struct S { int s, t; }; | 
|  |  | 
|  | int a = 1, b = 1; | 
|  | double c[27]; | 
|  | struct S d = { 8888, 8888 }; | 
|  | #pragma omp declare target link (a) to (b) link (c, d) | 
|  |  | 
|  | int | 
|  | foo (void) | 
|  | { | 
|  | return a++ + b++; | 
|  | } | 
|  |  | 
|  | int | 
|  | bar (int n) | 
|  | { | 
|  | int *p1 = &a; | 
|  | int *p2 = &b; | 
|  | c[n] += 2.0; | 
|  | d.s -= 2; | 
|  | d.t -= 2; | 
|  | return *p1 + *p2 + d.s + d.t; | 
|  | } | 
|  |  | 
|  | #pragma omp declare target (foo, bar) | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | a = b = 2; | 
|  | d.s = 17; | 
|  | d.t = 18; | 
|  |  | 
|  | int res, n = 10; | 
|  | #pragma omp target map (to: a, b, c, d) map (from: res) | 
|  | { | 
|  | res = foo () + foo (); | 
|  | c[n] = 3.0; | 
|  | res += bar (n); | 
|  | } | 
|  |  | 
|  | int shared_mem = 0; | 
|  | #pragma omp target map (alloc: shared_mem) | 
|  | shared_mem = 1; | 
|  |  | 
|  | if ((shared_mem && res != (2 + 2) + (3 + 3) + (4 + 4 + 15 + 16)) | 
|  | || (!shared_mem && res != (2 + 1) + (3 + 2) + (4 + 3 + 15 + 16))) | 
|  | __builtin_abort (); | 
|  |  | 
|  | #pragma omp target enter data map (to: c) | 
|  | #pragma omp target update from (c) | 
|  | res = (int) (c[n] + 0.5); | 
|  | if ((shared_mem && res != 5) || (!shared_mem && res != 0)) | 
|  | __builtin_abort (); | 
|  |  | 
|  | #pragma omp target map (to: a, b) map (from: res) | 
|  | res = foo (); | 
|  |  | 
|  | if ((shared_mem && res != 4 + 4) || (!shared_mem && res != 2 + 3)) | 
|  | __builtin_abort (); | 
|  |  | 
|  | return 0; | 
|  | } |