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