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