atomic-5.C 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // { dg-do run }
  2. extern "C" void abort (void);
  3. template <typename T>
  4. void
  5. foo ()
  6. {
  7. extern T v, x1, x2, x3, x4, x5, x6;
  8. #pragma omp atomic capture
  9. v = ++x1;
  10. if (!v)
  11. abort ();
  12. #pragma omp atomic capture
  13. v = x2++;
  14. if (v)
  15. abort ();
  16. #pragma omp atomic read
  17. v = x3;
  18. if (!v)
  19. abort ();
  20. #pragma omp atomic read
  21. v = x4;
  22. if (!v)
  23. abort ();
  24. #pragma omp atomic capture
  25. { v = x5; x5 |= 1; }
  26. if (v)
  27. abort ();
  28. #pragma omp atomic capture
  29. { x6 |= 1; v = x6; }
  30. if (!v)
  31. abort ();
  32. }
  33. template <typename T>
  34. void
  35. bar ()
  36. {
  37. extern T v, x1, x2;
  38. #pragma omp atomic write
  39. x1 = false;
  40. #pragma omp atomic write
  41. x2 = false;
  42. #pragma omp atomic capture
  43. { ++x1; v = x1; }
  44. if (!v)
  45. abort ();
  46. #pragma omp atomic capture
  47. { v = x2; x2++; }
  48. if (v)
  49. abort ();
  50. #pragma omp atomic write
  51. x1 = false;
  52. #pragma omp atomic write
  53. x2 = false;
  54. #pragma omp atomic capture
  55. { x1++; v = x1; }
  56. if (!v)
  57. abort ();
  58. #pragma omp atomic capture
  59. { v = x2; ++x2; }
  60. if (v)
  61. abort ();
  62. }
  63. bool v, x1, x2, x3, x4, x5, x6;
  64. int
  65. main ()
  66. {
  67. #pragma omp atomic write
  68. x3 = true;
  69. #pragma omp atomic write
  70. x4 = true;
  71. foo <bool> ();
  72. bar <bool> ();
  73. return 0;
  74. }