atomic-11.C 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // { dg-do run }
  2. extern "C" void abort (void);
  3. template <typename T>
  4. void
  5. foo ()
  6. {
  7. extern T x;
  8. T v, l = 2, s = 1;
  9. #pragma omp atomic
  10. x = -3 + x;
  11. #pragma omp atomic read
  12. v = x;
  13. if (v != 3)
  14. abort ();
  15. #pragma omp atomic update
  16. x = 3 * 2 * 1 + x;
  17. #pragma omp atomic read
  18. v = x;
  19. if (v != 9)
  20. abort ();
  21. #pragma omp atomic capture
  22. v = x = x | 16;
  23. if (v != 25)
  24. abort ();
  25. #pragma omp atomic capture
  26. v = x = x + 14 * 2 / 4;
  27. if (v != 32)
  28. abort ();
  29. #pragma omp atomic capture
  30. v = x = 5 | x;
  31. if (v != 37)
  32. abort ();
  33. #pragma omp atomic capture
  34. v = x = 40 + 12 - 2 - 7 - x;
  35. if (v != 6)
  36. abort ();
  37. #pragma omp atomic read
  38. v = x;
  39. if (v != 6)
  40. abort ();
  41. #pragma omp atomic capture
  42. { v = x; x = 3 + x; }
  43. if (v != 6)
  44. abort ();
  45. #pragma omp atomic capture
  46. { v = x; x = -1 * -1 * -1 * -1 - x; }
  47. if (v != 9)
  48. abort ();
  49. #pragma omp atomic read
  50. v = x;
  51. if (v != -8)
  52. abort ();
  53. #pragma omp atomic capture
  54. { x = 2 * 2 - x; v = x; }
  55. if (v != 12)
  56. abort ();
  57. #pragma omp atomic capture
  58. { x = 7 & x; v = x; }
  59. if (v != 4)
  60. abort ();
  61. #pragma omp atomic capture
  62. { v = x; x = 6; }
  63. if (v != 4)
  64. abort ();
  65. #pragma omp atomic read
  66. v = x;
  67. if (v != 6)
  68. abort ();
  69. #pragma omp atomic capture
  70. { v = x; x = 7 * 8 + 23; }
  71. if (v != 6)
  72. abort ();
  73. #pragma omp atomic read
  74. v = x;
  75. if (v != 79)
  76. abort ();
  77. #pragma omp atomic capture
  78. { v = x; x = 23 + 6 * 4; }
  79. if (v != 79)
  80. abort ();
  81. #pragma omp atomic read
  82. v = x;
  83. if (v != 47)
  84. abort ();
  85. #pragma omp atomic capture
  86. { v = x; x = l ? 17 : 12; }
  87. if (v != 47)
  88. abort ();
  89. #pragma omp atomic capture
  90. { v = x; x = l = s++ + 3; }
  91. if (v != 17 || l != 4 || s != 2)
  92. abort ();
  93. #pragma omp atomic read
  94. v = x;
  95. if (v != 4)
  96. abort ();
  97. }
  98. int x = 6;
  99. int
  100. main ()
  101. {
  102. foo <int> ();
  103. return 0;
  104. }