152
|
1 /* { dg-do run } */
|
|
2 /* { dg-options "-O0" } */
|
|
3
|
|
4 extern void abort (void);
|
|
5 volatile int v;
|
|
6 #pragma omp declare target to (v)
|
|
7 typedef void (*fnp1) (void);
|
|
8 typedef fnp1 (*fnp2) (void);
|
|
9 void f1 (void) { v++; }
|
|
10 void f2 (void) { v += 4; }
|
|
11 void f3 (void) { v += 16; f1 (); }
|
|
12 fnp1 f4 (void) { v += 64; return f2; }
|
|
13 int a = 1;
|
|
14 int *b = &a;
|
|
15 int **c = &b;
|
|
16 fnp2 f5 (void) { f3 (); return f4; }
|
|
17 #pragma omp declare target to (c, f5)
|
|
18
|
|
19 int
|
|
20 main ()
|
|
21 {
|
|
22 int err = 0;
|
|
23 #pragma omp target map(from:err)
|
|
24 {
|
|
25 volatile int xa;
|
|
26 int *volatile xb;
|
|
27 int **volatile xc;
|
|
28 fnp2 xd;
|
|
29 fnp1 xe;
|
|
30 err = 0;
|
|
31 xa = a;
|
|
32 err |= xa != 1;
|
|
33 xb = b;
|
|
34 err |= xb != &a;
|
|
35 xc = c;
|
|
36 err |= xc != &b;
|
|
37 xd = f5 ();
|
|
38 err |= v != 17;
|
|
39 xe = xd ();
|
|
40 err |= v != 81;
|
|
41 xe ();
|
|
42 err |= v != 85;
|
|
43 }
|
|
44 if (err)
|
|
45 abort ();
|
|
46 return 0;
|
|
47 }
|