1 /* { dg-do run } */
2 /* { dg-options "-O2 -fopenmp" } */
3 
4 extern void abort (void);
5 int x1, x2, x3, x4, x5;
6 volatile int y6 = 9, y2, y3, y4, y5;
7 volatile unsigned char z1, z2, z3, z4, z5;
8 float a1, a2, a3, a4;
9 
10 void
11 f1 (void)
12 {
13   #pragma omp atomic
14     x1++;
15   #pragma omp atomic
16     x2--;
17   #pragma omp atomic
18     ++x3;
19   #pragma omp atomic
20     --x4;
21   #pragma omp atomic
22     x5 += 1;
23   #pragma omp atomic
24     x1 -= y6;
25   #pragma omp atomic
26     x2 |= 1;
27   #pragma omp atomic
28     x3 &= 1;
29   #pragma omp atomic
30     x4 ^= 1;
31   #pragma omp atomic
32     x5 *= 3;
33   #pragma omp atomic
34     x1 /= 3;
35   #pragma omp atomic
36     x2 /= 3;
37   #pragma omp atomic
38     x3 <<= 3;
39   #pragma omp atomic
40     x4 >>= 3;
41 }
42 
43 void
44 f2 (void)
45 {
46   #pragma omp atomic
47     y6++;
48   #pragma omp atomic
49     y2--;
50   #pragma omp atomic
51     ++y3;
52   #pragma omp atomic
53     --y4;
54   #pragma omp atomic
55     y5 += 1;
56   #pragma omp atomic
57     y6 -= x1;
58   #pragma omp atomic
59     y2 |= 1;
60   #pragma omp atomic
61     y3 &= 1;
62   #pragma omp atomic
63     y4 ^= 1;
64   #pragma omp atomic
65     y5 *= 3;
66   #pragma omp atomic
67     y6 /= 3;
68   #pragma omp atomic
69     y2 /= 3;
70   #pragma omp atomic
71     y3 <<= 3;
72   #pragma omp atomic
73     y4 >>= 3;
74 }
75 
76 void
77 f3 (void)
78 {
79   #pragma omp atomic
80     z1++;
81   #pragma omp atomic
82     z2--;
83   #pragma omp atomic
84     ++z3;
85   #pragma omp atomic
86     --z4;
87   #pragma omp atomic
88     z5 += 1;
89   #pragma omp atomic
90     z1 |= 1;
91   #pragma omp atomic
92     z2 &= 1;
93   #pragma omp atomic
94     z3 ^= 1;
95   #pragma omp atomic
96     z4 *= 3;
97   #pragma omp atomic
98     z5 /= 3;
99   #pragma omp atomic
100     z1 /= 3;
101   #pragma omp atomic
102     z2 <<= 3;
103   #pragma omp atomic
104     z3 >>= 3;
105 }
106 
107 void
108 f4 (void)
109 {
110   #pragma omp atomic
111     a1 += 8.0;
112   #pragma omp atomic
113     a2 *= 3.5;
114   #pragma omp atomic
115     a3 -= a1 + a2;
116   #pragma omp atomic
117     a4 /= 2.0;
118 }
119 
120 int
121 main (void)
122 {
123   f1 ();
124   if (x1 != -2 || x2 != 0 || x3 != 8 || x4 != -1 || x5 != 3)
125     abort ();
126   f2 ();
127   if (y6 != 4 || y2 != 0 || y3 != 8 || y4 != -1 || y5 != 3)
128     abort ();
129   f3 ();
130   if (z1 != 0 || z2 != 8 || z3 != 0 || z4 != 253 || z5 != 0)
131     abort ();
132   a1 = 7;
133   a2 = 10;
134   a3 = 11;
135   a4 = 13;
136   f4 ();
137   if (a1 != 15.0 || a2 != 35.0 || a3 != -39.0 || a4 != 6.5)
138     abort ();
139   return 0;
140 }
141