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 
6 #include <stdatomic.h>
7 #include <limits.h>
8 
9 extern void abort (void);
10 
11 #define TEST_TYPE(TYPE, MAX)				\
12   do							\
13     {							\
14       struct S { char a[(MAX) + 1]; };			\
15       TYPE t = 1;					\
16       struct S a[2][2];					\
17       struct S (*_Atomic p)[2] = &a[0];			\
18       p += t;						\
19       if (p != &a[1])					\
20 	abort ();					\
21       p -= t;						\
22       if (p != &a[0])					\
23 	abort ();					\
24     }							\
25   while (0)
26 
27 int
main(void)28 main (void)
29 {
30   TEST_TYPE (signed char, UCHAR_MAX);
31   TEST_TYPE (signed short, USHRT_MAX);
32 }
33 
34 /* { dg-final { scan-tree-dump-not "__atomic_compare_exchange" "original" } } */
35