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