xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/nestedfn-4.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* PR middle-end/25261 */
2*404b540aSrobert /* { dg-do run } */
3*404b540aSrobert 
4*404b540aSrobert #include <omp.h>
5*404b540aSrobert 
6*404b540aSrobert extern void abort (void);
7*404b540aSrobert 
8*404b540aSrobert int
main(void)9*404b540aSrobert main (void)
10*404b540aSrobert {
11*404b540aSrobert   int i = 5, j, l = 0;
12*404b540aSrobert   int foo (void)
13*404b540aSrobert   {
14*404b540aSrobert     return i == 6;
15*404b540aSrobert   }
16*404b540aSrobert   int bar (void)
17*404b540aSrobert   {
18*404b540aSrobert     return i - 3;
19*404b540aSrobert   }
20*404b540aSrobert 
21*404b540aSrobert   omp_set_dynamic (0);
22*404b540aSrobert 
23*404b540aSrobert #pragma omp parallel if (foo ()) num_threads (2)
24*404b540aSrobert   if (omp_get_num_threads () != 1)
25*404b540aSrobert #pragma omp atomic
26*404b540aSrobert     l++;
27*404b540aSrobert 
28*404b540aSrobert #pragma omp parallel for schedule (static, bar ()) num_threads (2) \
29*404b540aSrobert 		     reduction (|:l)
30*404b540aSrobert   for (j = 0; j < 4; j++)
31*404b540aSrobert     if (omp_get_thread_num () != (j >= 2))
32*404b540aSrobert #pragma omp atomic
33*404b540aSrobert       l++;
34*404b540aSrobert 
35*404b540aSrobert   i++;
36*404b540aSrobert 
37*404b540aSrobert #pragma omp parallel if (foo ()) num_threads (2)
38*404b540aSrobert   if (omp_get_num_threads () != 2)
39*404b540aSrobert #pragma omp atomic
40*404b540aSrobert     l++;
41*404b540aSrobert 
42*404b540aSrobert #pragma omp parallel for schedule (static, bar ()) num_threads (2) \
43*404b540aSrobert 		     reduction (|:l)
44*404b540aSrobert   for (j = 0; j < 6; j++)
45*404b540aSrobert     if (omp_get_thread_num () != (j >= 3))
46*404b540aSrobert #pragma omp atomic
47*404b540aSrobert       l++;
48*404b540aSrobert 
49*404b540aSrobert #pragma omp parallel num_threads (4) reduction (|:l)
50*404b540aSrobert   if (!foo () || bar () != 3)
51*404b540aSrobert #pragma omp atomic
52*404b540aSrobert       l++;
53*404b540aSrobert 
54*404b540aSrobert   i++;
55*404b540aSrobert 
56*404b540aSrobert #pragma omp parallel num_threads (4) reduction (|:l)
57*404b540aSrobert   if (foo () || bar () != 4)
58*404b540aSrobert #pragma omp atomic
59*404b540aSrobert       l++;
60*404b540aSrobert 
61*404b540aSrobert   if (l)
62*404b540aSrobert     abort ();
63*404b540aSrobert 
64*404b540aSrobert   return 0;
65*404b540aSrobert }
66