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 v, x1, x2, x3, x4, x5, x6;
10 #pragma omp atomic capture
11 v = ++x1;
12 if (!v)
13 abort ();
14 #pragma omp atomic capture
15 v = x2++;
16 if (v)
17 abort ();
18 #pragma omp atomic read
19 v = x3;
20 if (!v)
21 abort ();
22 #pragma omp atomic read
23 v = x4;
24 if (!v)
25 abort ();
26 #pragma omp atomic capture
27 { v = x5; x5 |= 1; }
28 if (v)
29 abort ();
30 #pragma omp atomic capture
31 { x6 |= 1; v = x6; }
32 if (!v)
33 abort ();
34 }
35
36 template <typename T>
37 void
bar()38 bar ()
39 {
40 extern T v, x1, x2;
41 #pragma omp atomic write
42 x1 = false;
43 #pragma omp atomic write
44 x2 = false;
45 #pragma omp atomic capture
46 { ++x1; v = x1; }
47 if (!v)
48 abort ();
49 #pragma omp atomic capture
50 { v = x2; x2++; }
51 if (v)
52 abort ();
53 #pragma omp atomic write
54 x1 = false;
55 #pragma omp atomic write
56 x2 = false;
57 #pragma omp atomic capture
58 { x1++; v = x1; }
59 if (!v)
60 abort ();
61 #pragma omp atomic capture
62 { v = x2; ++x2; }
63 if (v)
64 abort ();
65 }
66
67 bool v, x1, x2, x3, x4, x5, x6;
68
69 int
main()70 main ()
71 {
72 #pragma omp atomic write
73 x3 = true;
74 #pragma omp atomic write
75 x4 = true;
76 foo <bool> ();
77 bar <bool> ();
78 return 0;
79 }
80