1  /* { dg-do run } */
       2  
       3  enum memmodel {
       4    MEMMODEL_RELAXED = 0
       5  };
       6  
       7  int
       8  main (void)
       9  {
      10    int a, b;
      11  
      12    a = 1;
      13    __atomic_fetch_add (&a, 1, MEMMODEL_RELAXED);
      14    if (a != 2)
      15      __builtin_abort ();
      16  
      17    a = 0;
      18    __atomic_fetch_or (&a, 1, MEMMODEL_RELAXED);
      19    if (a != 1)
      20      __builtin_abort ();
      21    
      22    a = 1;
      23    b = -1;
      24    b = __atomic_exchange_n (&a, 0, MEMMODEL_RELAXED);
      25    if (a != 0)
      26      __builtin_abort ();
      27    if (b != 1)
      28      __builtin_abort ();
      29  
      30    a = 1;
      31    b = -1;
      32    {
      33      int expected = a;
      34      b = __atomic_compare_exchange_n (&a, &expected, 0, 0, MEMMODEL_RELAXED,
      35  				     MEMMODEL_RELAXED);
      36    }
      37    if (a != 0)
      38      __builtin_abort ();
      39    if (b != 1)
      40      __builtin_abort ();
      41  
      42    a = 1;
      43    __atomic_store_n (&a, 0, MEMMODEL_RELAXED);
      44    if (a != 0)
      45      __builtin_abort ();
      46  
      47    return 0;
      48  }