pr61200.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* PR libgomp/61200 */
  2. /* { dg-do run } */
  3. /* { dg-additional-options "-Wno-deprecated-declarations" } */
  4. #include <omp.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. volatile int x;
  8. void
  9. foo ()
  10. {
  11. int var = 1;
  12. int i;
  13. for (i = 0; i < 2; i++)
  14. {
  15. if (i == 1)
  16. {
  17. #pragma omp parallel num_threads(2)
  18. if (x)
  19. var++;
  20. else
  21. {
  22. #pragma omp single
  23. sleep (2);
  24. }
  25. }
  26. else
  27. {
  28. #pragma omp task shared(var)
  29. {
  30. sleep (1);
  31. var = 2;
  32. }
  33. }
  34. }
  35. #pragma omp taskwait
  36. if (var != 2)
  37. abort ();
  38. }
  39. void
  40. bar ()
  41. {
  42. int var = 1;
  43. int i;
  44. for (i = 0; i < 2; i++)
  45. {
  46. if (i == 0)
  47. {
  48. #pragma omp task shared(var)
  49. {
  50. sleep (1);
  51. var = 2;
  52. }
  53. }
  54. else
  55. {
  56. #pragma omp parallel num_threads(2)
  57. if (x)
  58. var++;
  59. else
  60. {
  61. #pragma omp single
  62. sleep (2);
  63. }
  64. }
  65. }
  66. #pragma omp taskwait
  67. if (var != 2)
  68. abort ();
  69. }
  70. int
  71. main ()
  72. {
  73. omp_set_nested (1);
  74. #pragma omp parallel num_threads(2)
  75. #pragma omp single
  76. foo ();
  77. #pragma omp parallel num_threads(2)
  78. #pragma omp single
  79. bar ();
  80. return 0;
  81. }