/* { 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; }