1/* PR middle-end/36802 */ 2 3extern void abort (void); 4extern int omp_set_dynamic (int); 5extern void omp_set_nested (int); 6extern int omp_get_num_threads (void); 7 8int q; 9 10int 11foo (int k) 12{ 13 int i = 6, n = 0; 14 omp_set_dynamic (0); 15 omp_set_nested (1); 16#pragma omp parallel shared (i) num_threads (3) 17 { 18 int l; 19 20 if (omp_get_num_threads () != 3) 21 #pragma omp atomic 22 n += 1; 23 else 24 #pragma omp for 25 for (l = 0; l < 3; l++) 26 if (!k) 27 #pragma omp parallel shared (i) num_threads (4) 28 { 29 if (omp_get_num_threads () != 4) 30 #pragma omp atomic 31 n += 1; 32 #pragma omp critical 33 i += 1; 34 } 35 else 36 #pragma omp atomic 37 q += i; 38 } 39 if (n == 0 && i != 6 + 3 * 4) 40 abort (); 41 return 0; 42} 43 44int 45main (void) 46{ 47 foo (0); 48 return 0; 49} 50