xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/critical-2.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert // { dg-do run }
2*404b540aSrobert // Test several constructs within a parallel.  At one point in development,
3*404b540aSrobert // the critical directive clobbered the shared clause of the parallel.
4*404b540aSrobert 
5*404b540aSrobert #include <omp.h>
6*404b540aSrobert #include <stdlib.h>
7*404b540aSrobert 
8*404b540aSrobert #define N       2000
9*404b540aSrobert 
main()10*404b540aSrobert int main()
11*404b540aSrobert {
12*404b540aSrobert   int A[N];
13*404b540aSrobert   int nthreads;
14*404b540aSrobert   int i;
15*404b540aSrobert 
16*404b540aSrobert #pragma omp parallel shared (A, nthreads)
17*404b540aSrobert   {
18*404b540aSrobert     #pragma omp master
19*404b540aSrobert       nthreads = omp_get_num_threads ();
20*404b540aSrobert 
21*404b540aSrobert     #pragma omp for
22*404b540aSrobert       for (i = 0; i < N; i++)
23*404b540aSrobert         A[i] = 0;
24*404b540aSrobert 
25*404b540aSrobert     #pragma omp critical
26*404b540aSrobert       for (i = 0; i < N; i++)
27*404b540aSrobert         A[i] += 1;
28*404b540aSrobert   }
29*404b540aSrobert 
30*404b540aSrobert   for (i = 0; i < N; i++)
31*404b540aSrobert     if (A[i] != nthreads)
32*404b540aSrobert       abort ();
33*404b540aSrobert 
34*404b540aSrobert   return 0;
35*404b540aSrobert }
36