(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
atomic-16.c
       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    p = &x;
      17    #pragma omp atomic update
      18      p[foo (), 0] = 16 + 6 - p[foo (), 0];
      19    #pragma omp atomic read
      20      v = x;
      21    if (cnt != 2 || v != 16)
      22      abort ();
      23    #pragma omp atomic capture
      24      v = p[foo () + foo (), 0] = p[foo () + foo (), 0] + 3;
      25    if (cnt != 6 || v != 19)
      26      abort ();
      27    #pragma omp atomic capture
      28      v = p[foo (), 0] = 12 * 1 / 2 + (foo (), 0) + p[foo (), 0];
      29    if (cnt != 9 || v != 25)
      30      abort ();
      31    #pragma omp atomic capture
      32      {
      33        v = p[foo () & 0]; p[foo () & 0] = (foo (), 1) * 9 - p[foo () & 0];
      34      }
      35    if (cnt != 13 || v != 25)
      36      abort ();
      37    #pragma omp atomic read
      38      v = x;
      39    if (v != -16)
      40      abort ();
      41    #pragma omp atomic capture
      42      {
      43        p[0 & foo ()] = 16 - 2 + 3 + p[0 & foo ()]; v = p[0 & foo ()];
      44      }
      45    if (cnt != 16 || v != 1)
      46      abort ();
      47    #pragma omp atomic capture
      48      {
      49        v = p[foo (), 0]; p[foo (), 0] = (foo (), 7) ? 13 : foo () + 6;
      50      }
      51    if (cnt != 19 || v != 1)
      52      abort ();
      53    #pragma omp atomic read
      54      v = x;
      55    if (v != 13)
      56      abort ();
      57    return 0;
      58  }