1  /* Test we're able use __atomic_fetch_* where possible and verify
       2     we generate correct code.  */
       3  /* { dg-do run } */
       4  /* { dg-options "-std=c11 -pedantic-errors -fdump-tree-original" } */
       5  /* { dg-xfail-run-if "PR97444: stack atomics" { nvptx*-*-* } }*/
       6  
       7  #include <stdatomic.h>
       8  #include <limits.h>
       9  
      10  extern void abort (void);
      11  
      12  #define TEST_TYPE(TYPE, MAX)				\
      13    do							\
      14      {							\
      15        struct S { char a[(MAX) + 1]; };			\
      16        TYPE t = 1;					\
      17        struct S a[2][2];					\
      18        struct S (*_Atomic p)[2] = &a[0];			\
      19        p += t;						\
      20        if (p != &a[1])					\
      21  	abort ();					\
      22        p -= t;						\
      23        if (p != &a[0])					\
      24  	abort ();					\
      25      }							\
      26    while (0)
      27  
      28  int
      29  main (void)
      30  {
      31    TEST_TYPE (signed char, UCHAR_MAX);
      32    TEST_TYPE (signed short, USHRT_MAX);
      33  }
      34  
      35  /* { dg-final { scan-tree-dump-not "__atomic_compare_exchange" "original" } } */