pr36802-3.c 780 B

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