| // { dg-do run } | 
 | // Test several constructs within a parallel.  At one point in development, | 
 | // the critical directive clobbered the shared clause of the parallel. | 
 |  | 
 | #include <omp.h> | 
 | #include <stdlib.h> | 
 |  | 
 | #define N       2000 | 
 |  | 
 | int main() | 
 | { | 
 |   int A[N]; | 
 |   int nthreads; | 
 |   int i; | 
 |  | 
 | #pragma omp parallel shared (A, nthreads) | 
 |   { | 
 |     #pragma omp master | 
 |       nthreads = omp_get_num_threads (); | 
 |  | 
 |     #pragma omp for | 
 |       for (i = 0; i < N; i++) | 
 |         A[i] = 0; | 
 |  | 
 |     #pragma omp critical | 
 |       for (i = 0; i < N; i++) | 
 |         A[i] += 1; | 
 |   } | 
 |  | 
 |   for (i = 0; i < N; i++) | 
 |     if (A[i] != nthreads) | 
 |       abort (); | 
 |  | 
 |   return 0; | 
 | } |