| /* { dg-do run } */ |
| /* { dg-options "-O0" } */ |
| |
| extern void abort (void); |
| volatile int v; |
| #pragma omp declare target to (v) |
| typedef void (*fnp1) (void); |
| typedef fnp1 (*fnp2) (void); |
| void f1 (void) { v++; } |
| void f2 (void) { v += 4; } |
| void f3 (void) { v += 16; f1 (); } |
| fnp1 f4 (void) { v += 64; return f2; } |
| int a = 1; |
| int *b = &a; |
| int **c = &b; |
| fnp2 f5 (void) { f3 (); return f4; } |
| #pragma omp declare target to (c, f5) |
| |
| int |
| main () |
| { |
| int err = 0; |
| #pragma omp target map(from:err) |
| { |
| volatile int xa; |
| int *volatile xb; |
| int **volatile xc; |
| fnp2 xd; |
| fnp1 xe; |
| err = 0; |
| xa = a; |
| err |= xa != 1; |
| xb = b; |
| err |= xb != &a; |
| xc = c; |
| err |= xc != &b; |
| xd = f5 (); |
| err |= v != 17; |
| xe = xd (); |
| err |= v != 81; |
| xe (); |
| err |= v != 85; |
| } |
| if (err) |
| abort (); |
| return 0; |
| } |