pr64868.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /* PR c/64868 */
  2. /* { dg-do run } */
  3. float f = 2.0f;
  4. double d = 4.0;
  5. long double ld = 8.0L;
  6. void
  7. foo ()
  8. {
  9. #pragma omp atomic
  10. f = 1.0f / f;
  11. #pragma omp atomic
  12. f = 1 / f;
  13. #pragma omp atomic
  14. f = f / 2.0f;
  15. #pragma omp atomic
  16. f = f / 2;
  17. #pragma omp atomic
  18. f /= 2.0f;
  19. #pragma omp atomic
  20. f /= 2;
  21. #pragma omp atomic
  22. d = 1.0 / d;
  23. #pragma omp atomic
  24. d = 1 / d;
  25. #pragma omp atomic
  26. d = d / 2.0;
  27. #pragma omp atomic
  28. d = d / 2;
  29. #pragma omp atomic
  30. d /= 2.0;
  31. #pragma omp atomic
  32. d /= 2;
  33. #pragma omp atomic
  34. ld = 1.0L / ld;
  35. #pragma omp atomic
  36. ld = 1 / ld;
  37. #pragma omp atomic
  38. ld = ld / 2.0L;
  39. #pragma omp atomic
  40. ld = ld / 2;
  41. #pragma omp atomic
  42. ld /= 2.0L;
  43. #pragma omp atomic
  44. ld /= 2;
  45. if (f != 0.125f || d != 0.25 || ld != 0.5L)
  46. __builtin_abort ();
  47. }
  48. #ifdef __cplusplus
  49. template <typename T, int N1, int N2>
  50. void
  51. bar ()
  52. {
  53. T v = ::d;
  54. #pragma omp atomic
  55. v *= 16;
  56. #pragma omp atomic
  57. v = 1.0 / v;
  58. #pragma omp atomic
  59. v = N1 / v;
  60. #pragma omp atomic
  61. v = v / 2.0;
  62. #pragma omp atomic
  63. v = v / N2;
  64. #pragma omp atomic
  65. v /= 2.0;
  66. #pragma omp atomic
  67. v /= N2;
  68. if (v != 0.25)
  69. __builtin_abort ();
  70. }
  71. #endif
  72. int
  73. main ()
  74. {
  75. foo ();
  76. #ifdef __cplusplus
  77. bar<float, 1, 2> ();
  78. bar<double, 1, 2> ();
  79. bar<long double, 1, 2> ();
  80. #endif
  81. return 0;
  82. }