atomic-9.C 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // { dg-do run }
  2. extern "C" void abort ();
  3. int cnt;
  4. int
  5. foo ()
  6. {
  7. return cnt++;
  8. }
  9. template <typename T>
  10. void
  11. bar ()
  12. {
  13. extern T x;
  14. T v, *p;
  15. #pragma omp atomic update
  16. x = x + 7;
  17. #pragma omp atomic
  18. x = x + 7 + 6;
  19. #pragma omp atomic update
  20. x = x + 2 * 3;
  21. #pragma omp atomic
  22. x = x * (2 - 1);
  23. #pragma omp atomic read
  24. v = x;
  25. if (v != 32)
  26. abort ();
  27. #pragma omp atomic write
  28. x = 0;
  29. #pragma omp atomic capture
  30. {
  31. v = x;
  32. x = x | 1 ^ 2;
  33. }
  34. if (v != 0)
  35. abort ();
  36. #pragma omp atomic capture
  37. {
  38. v = x;
  39. x = x | 4 | 2;
  40. }
  41. if (v != 3)
  42. abort ();
  43. #pragma omp atomic read
  44. v = x;
  45. if (v != 7)
  46. abort ();
  47. #pragma omp atomic capture
  48. {
  49. x = x ^ 6 & 2;
  50. v = x;
  51. }
  52. if (v != 5)
  53. abort ();
  54. #pragma omp atomic capture
  55. { x = x - (6 + 4); v = x; }
  56. if (v != -5)
  57. abort ();
  58. #pragma omp atomic capture
  59. { v = x; x = x - (1 | 2); }
  60. if (v != -5)
  61. abort ();
  62. #pragma omp atomic read
  63. v = x;
  64. if (v != -8)
  65. abort ();
  66. #pragma omp atomic
  67. x = x * -4 / 2;
  68. #pragma omp atomic read
  69. v = x;
  70. if (v != 16)
  71. abort ();
  72. p = &x;
  73. #pragma omp atomic update
  74. p[foo (), 0] = p[foo (), 0] - 16;
  75. #pragma omp atomic read
  76. v = x;
  77. if (cnt != 2 || v != 0)
  78. abort ();
  79. #pragma omp atomic capture
  80. {
  81. p[foo (), 0] += 6;
  82. v = p[foo (), 0];
  83. }
  84. if (cnt != 4 || v != 6)
  85. abort ();
  86. #pragma omp atomic capture
  87. {
  88. v = p[foo (), 0];
  89. p[foo (), 0] += 6;
  90. }
  91. if (cnt != 6 || v != 6)
  92. abort ();
  93. #pragma omp atomic read
  94. v = x;
  95. if (v != 12)
  96. abort ();
  97. #pragma omp atomic capture
  98. {
  99. p[foo (), 0] = p[foo (), 0] + 6;
  100. v = p[foo (), 0];
  101. }
  102. if (cnt != 9 || v != 18)
  103. abort ();
  104. #pragma omp atomic capture
  105. {
  106. v = p[foo (), 0];
  107. p[foo (), 0] = p[foo (), 0] + 6;
  108. }
  109. if (cnt != 12 || v != 18)
  110. abort ();
  111. #pragma omp atomic read
  112. v = x;
  113. if (v != 24)
  114. abort ();
  115. #pragma omp atomic capture
  116. { v = p[foo (), 0]; p[foo (), 0]++; }
  117. #pragma omp atomic capture
  118. { v = p[foo (), 0]; ++p[foo (), 0]; }
  119. #pragma omp atomic capture
  120. { p[foo (), 0]++; v = p[foo (), 0]; }
  121. #pragma omp atomic capture
  122. { ++p[foo (), 0]; v = p[foo (), 0]; }
  123. if (cnt != 20 || v != 28)
  124. abort ();
  125. #pragma omp atomic capture
  126. { v = p[foo (), 0]; p[foo (), 0]--; }
  127. #pragma omp atomic capture
  128. { v = p[foo (), 0]; --p[foo (), 0]; }
  129. #pragma omp atomic capture
  130. { p[foo (), 0]--; v = p[foo (), 0]; }
  131. #pragma omp atomic capture
  132. { --p[foo (), 0]; v = p[foo (), 0]; }
  133. if (cnt != 28 || v != 24)
  134. abort ();
  135. }
  136. int x = 6;
  137. int
  138. main ()
  139. {
  140. bar <int> ();
  141. return 0;
  142. }