1  /* { dg-do run } */
       2  
       3  extern void abort (void);
       4  int x = 6, cnt;
       5  
       6  int
       7  foo (void)
       8  {
       9    return cnt++;
      10  }
      11  
      12  int
      13  main ()
      14  {
      15    int v, *p;
      16    #pragma omp atomic update
      17      x = x + 7;
      18    #pragma omp atomic
      19      x = x + (7 + 6);
      20    #pragma omp atomic update
      21      x = x + 2 * 3;
      22    #pragma omp atomic
      23      x = x * (2 - 1);
      24    #pragma omp atomic read
      25      v = x;
      26    if (v != 32)
      27      abort ();
      28    #pragma omp atomic write
      29      x = 0;
      30    #pragma omp atomic capture
      31      {
      32        v = x;
      33        x = x | 1 ^ 2;
      34      }
      35    if (v != 0)
      36      abort ();
      37    #pragma omp atomic capture
      38      {
      39        v = x;
      40        x = x | 4 | 2;
      41      }
      42    if (v != 3)
      43      abort ();
      44    #pragma omp atomic read
      45      v = x;
      46    if (v != 7)
      47      abort ();
      48    #pragma omp atomic capture
      49      {
      50        x = x ^ 6 & 2;
      51        v = x;
      52      }
      53    if (v != 5)
      54      abort ();
      55    #pragma omp atomic capture
      56      { x = x - (6 + 4); v = x; }
      57    if (v != -5)
      58      abort ();
      59    #pragma omp atomic capture
      60      { v = x; x = x - (1 | 2); }
      61    if (v != -5)
      62      abort ();
      63    #pragma omp atomic read
      64      v = x;
      65    if (v != -8)
      66      abort ();
      67    #pragma omp atomic
      68      x = x * (-4 / 2);
      69    #pragma omp atomic read
      70      v = x;
      71    if (v != 16)
      72      abort ();
      73    p = &x;
      74    #pragma omp atomic update
      75      p[foo (), 0] = p[foo (), 0] - 16;
      76    #pragma omp atomic read
      77      v = x;
      78    if (cnt != 2 || v != 0)
      79      abort ();
      80    #pragma omp atomic capture
      81      {
      82        p[foo (), 0] += 6;
      83        v = p[foo (), 0];
      84      }
      85    if (cnt != 4 || v != 6)
      86      abort ();
      87    #pragma omp atomic capture
      88      {
      89        v = p[foo (), 0];
      90        p[foo (), 0] += 6;
      91      }
      92    if (cnt != 6 || v != 6)
      93      abort ();
      94    #pragma omp atomic read
      95      v = x;
      96    if (v != 12)
      97      abort ();
      98    #pragma omp atomic capture
      99      {
     100        p[foo (), 0] = p[foo (), 0] + 6;
     101        v = p[foo (), 0];
     102      }
     103    if (cnt != 9 || v != 18)
     104      abort ();
     105    #pragma omp atomic capture
     106      {
     107        v = p[foo (), 0];
     108        p[foo (), 0] = p[foo (), 0] + 6;
     109      }
     110    if (cnt != 12 || v != 18)
     111      abort ();
     112    #pragma omp atomic read
     113      v = x;
     114    if (v != 24)
     115      abort ();
     116    #pragma omp atomic capture
     117    { v = p[foo (), 0]; p[foo (), 0]++; }
     118    #pragma omp atomic capture
     119    { v = p[foo (), 0]; ++p[foo (), 0]; }
     120    #pragma omp atomic capture
     121    { p[foo (), 0]++; v = p[foo (), 0]; }
     122    #pragma omp atomic capture
     123    { ++p[foo (), 0]; v = p[foo (), 0]; }
     124    if (cnt != 20 || v != 28)
     125      abort ();
     126    #pragma omp atomic capture
     127    { v = p[foo (), 0]; p[foo (), 0]--; }
     128    #pragma omp atomic capture
     129    { v = p[foo (), 0]; --p[foo (), 0]; }
     130    #pragma omp atomic capture
     131    { p[foo (), 0]--; v = p[foo (), 0]; }
     132    #pragma omp atomic capture
     133    { --p[foo (), 0]; v = p[foo (), 0]; }
     134    if (cnt != 28 || v != 24)
     135      abort ();
     136    return 0;
     137  }