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