1 /* Test for _Atomic in C11.  Basic execution tests for atomic
2    increment and decrement.  */
3 /* { dg-do run } */
4 /* { dg-options "-std=c11 -pedantic-errors" } */
5 
6 extern void abort (void);
7 extern void exit (int);
8 
9 #define TEST_INCDEC(TYPE, VALUE, PREOP, POSTOP, PRE_P, CHANGE)		\
10   do									\
11     {									\
12       static volatile _Atomic (TYPE) a = (TYPE) (VALUE);		\
13       if (PREOP a POSTOP != (PRE_P					\
14 			     ? (TYPE) ((TYPE) (VALUE) + (CHANGE))	\
15 			     : (TYPE) (VALUE)))				\
16 	abort ();							\
17       if (a != (TYPE) ((TYPE) (VALUE) + (CHANGE)))			\
18 	abort ();							\
19     }									\
20   while (0)
21 
22 #define TEST_INCDEC_ARITH(VALUE, PREOP, POSTOP, PRE_P, CHANGE)		\
23   do									\
24     {									\
25       TEST_INCDEC (_Bool, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE));	\
26       TEST_INCDEC (char, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE));	\
27       TEST_INCDEC (signed char, (VALUE), PREOP, POSTOP, (PRE_P),	\
28 		   (CHANGE));						\
29       TEST_INCDEC (unsigned char, (VALUE), PREOP, POSTOP, (PRE_P),	\
30 		   (CHANGE));						\
31       TEST_INCDEC (signed short, (VALUE), PREOP, POSTOP, (PRE_P),	\
32 		   (CHANGE));						\
33       TEST_INCDEC (unsigned short, (VALUE), PREOP, POSTOP, (PRE_P),	\
34 		   (CHANGE));						\
35       TEST_INCDEC (signed int, (VALUE), PREOP, POSTOP, (PRE_P),		\
36 		   (CHANGE));						\
37       TEST_INCDEC (unsigned int, (VALUE), PREOP, POSTOP, (PRE_P),	\
38 		   (CHANGE));						\
39       TEST_INCDEC (signed long, (VALUE), PREOP, POSTOP, (PRE_P),	\
40 		   (CHANGE));						\
41       TEST_INCDEC (unsigned long, (VALUE), PREOP, POSTOP, (PRE_P),	\
42 		   (CHANGE));						\
43       TEST_INCDEC (signed long long, (VALUE), PREOP, POSTOP, (PRE_P),	\
44 		   (CHANGE));						\
45       TEST_INCDEC (unsigned long long, (VALUE), PREOP, POSTOP, (PRE_P), \
46 		   (CHANGE));						\
47       TEST_INCDEC (float, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE));	\
48       TEST_INCDEC (double, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE));	\
49       TEST_INCDEC (long double, (VALUE), PREOP, POSTOP, (PRE_P),	\
50 		   (CHANGE));						\
51     }									\
52   while (0)
53 
54 #define TEST_ALL_INCDEC_ARITH(VALUE)		\
55   do						\
56     {						\
57       TEST_INCDEC_ARITH ((VALUE), ++, , 1, 1);	\
58       TEST_INCDEC_ARITH ((VALUE), --, , 1, -1);	\
59       TEST_INCDEC_ARITH ((VALUE), , ++, 0, 1);	\
60       TEST_INCDEC_ARITH ((VALUE), , --, 0, -1);	\
61     }						\
62   while (0)
63 
64 static void
test_incdec(void)65 test_incdec (void)
66 {
67   TEST_ALL_INCDEC_ARITH (0);
68   TEST_ALL_INCDEC_ARITH (1);
69   TEST_ALL_INCDEC_ARITH (2);
70   TEST_ALL_INCDEC_ARITH (-1);
71   TEST_ALL_INCDEC_ARITH (1ULL << 60);
72   TEST_ALL_INCDEC_ARITH (1.5);
73   static int ia[2];
74   TEST_INCDEC (int *, &ia[1], ++, , 1, 1);
75   TEST_INCDEC (int *, &ia[1], --, , 1, -1);
76   TEST_INCDEC (int *, &ia[1], , ++, 0, 1);
77   TEST_INCDEC (int *, &ia[1], , --, 0, -1);
78 }
79 
80 int
main(void)81 main (void)
82 {
83   test_incdec ();
84   exit (0);
85 }
86