1 // { dg-do run }
2 
3 extern "C" void abort (void);
4 
5 template <typename T>
6 void
foo()7 foo ()
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 
101 int x = 6;
102 
103 int
main()104 main ()
105 {
106   foo <int> ();
107   return 0;
108 }
109