1 // { dg-do run }
2
3 #include <omp.h>
4
5 __attribute__((noinline, noclone)) void
foo(int & a,short & d,char & g)6 foo (int &a, short &d, char &g)
7 {
8 unsigned long b = 12;
9 unsigned long &c = b;
10 long long e = 21;
11 long long &f = e;
12 unsigned int h = 12;
13 unsigned int &k = h;
14 #pragma omp parallel default(none) private(a, c) firstprivate(d, f) shared(g, k)
15 {
16 int i = omp_get_thread_num ();
17 a = i;
18 c = 2 * i;
19 if (d != 27 || f != 21)
20 __builtin_abort ();
21 d = 3 * (i & 0xfff);
22 f = 4 * i;
23 #pragma omp barrier
24 if (a != i || c != 2 * i || d != 3 * (i & 0xfff) || f != 4 * i)
25 __builtin_abort ();
26 #pragma omp for lastprivate(g, k)
27 for (int j = 0; j < 32; j++)
28 {
29 g = j;
30 k = 3 * j;
31 }
32 }
33 if (g != 31 || k != 31 * 3)
34 __builtin_abort ();
35 #pragma omp parallel for firstprivate (g, k) lastprivate (g, k)
36 for (int j = 0; j < 32; j++)
37 {
38 if (g != 31 || k != 31 * 3)
39 __builtin_abort ();
40 if (j == 31)
41 {
42 g = 29;
43 k = 138;
44 }
45 }
46 if (g != 29 || k != 138)
47 __builtin_abort ();
48 }
49
50 int
main()51 main ()
52 {
53 int a = 5;
54 short d = 27;
55 char g = ' ';
56 foo (a, d, g);
57 }
58