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