1// { dg-do run }
2
3extern "C" void abort (void);
4
5template <typename S, typename T>
6void
7foo (void)
8{
9  extern S l, m;
10  extern T i, j;
11
12  #pragma omp atomic read
13    i = l;
14  #pragma omp atomic read
15    m = j;
16  if (i != 77 || m != 88)
17    abort ();
18  #pragma omp atomic write
19    l = 1 + i + 6 * 1;
20  #pragma omp atomic write
21    j = 170 - 170 + m + 1 * 7;
22  #pragma omp atomic capture
23    i = l += 4;
24  #pragma omp atomic capture
25    m = j += 4;
26  if (i != 88 || m != 99)
27    abort ();
28  #pragma omp atomic capture
29    {
30      i = l;
31      l += 4;
32    }
33  #pragma omp atomic capture
34    {
35      m = j;
36      j += 4;
37    }
38  if (i != 88 || m != 99)
39    abort ();
40  #pragma omp atomic capture
41    {
42      l += 4;
43      i = l;
44    }
45  #pragma omp atomic capture
46    {
47      j += 4;
48      m = j;
49    }
50  if (i != 96 || m != 107)
51    abort ();
52}
53
54long long l, m;
55int i, j;
56
57int
58main ()
59{
60  l = 77;
61  j = 88;
62  foo <long long, int> ();
63}
64