/* Test for _Atomic in C11. Basic execution tests for atomic increment and decrement. */ /* { dg-do run } */ /* { dg-options "-std=c11 -pedantic-errors" } */ extern void abort (void); extern void exit (int); #define TEST_INCDEC(TYPE, VALUE, PREOP, POSTOP, PRE_P, CHANGE) \ do \ { \ static volatile _Atomic (TYPE) a = (TYPE) (VALUE); \ if (PREOP a POSTOP != (PRE_P \ ? (TYPE) ((TYPE) (VALUE) + (CHANGE)) \ : (TYPE) (VALUE))) \ abort (); \ if (a != (TYPE) ((TYPE) (VALUE) + (CHANGE))) \ abort (); \ } \ while (0) #define TEST_INCDEC_ARITH(VALUE, PREOP, POSTOP, PRE_P, CHANGE) \ do \ { \ TEST_INCDEC (_Bool, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE)); \ TEST_INCDEC (char, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE)); \ TEST_INCDEC (signed char, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (unsigned char, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (signed short, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (unsigned short, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (signed int, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (unsigned int, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (signed long, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (unsigned long, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (signed long long, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (unsigned long long, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ TEST_INCDEC (float, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE)); \ TEST_INCDEC (double, (VALUE), PREOP, POSTOP, (PRE_P), (CHANGE)); \ TEST_INCDEC (long double, (VALUE), PREOP, POSTOP, (PRE_P), \ (CHANGE)); \ } \ while (0) #define TEST_ALL_INCDEC_ARITH(VALUE) \ do \ { \ TEST_INCDEC_ARITH ((VALUE), ++, , 1, 1); \ TEST_INCDEC_ARITH ((VALUE), --, , 1, -1); \ TEST_INCDEC_ARITH ((VALUE), , ++, 0, 1); \ TEST_INCDEC_ARITH ((VALUE), , --, 0, -1); \ } \ while (0) static void test_incdec (void) { TEST_ALL_INCDEC_ARITH (0); TEST_ALL_INCDEC_ARITH (1); TEST_ALL_INCDEC_ARITH (2); TEST_ALL_INCDEC_ARITH (-1); TEST_ALL_INCDEC_ARITH (1ULL << 60); TEST_ALL_INCDEC_ARITH (1.5); static int ia[2]; TEST_INCDEC (int *, &ia[1], ++, , 1, 1); TEST_INCDEC (int *, &ia[1], --, , 1, -1); TEST_INCDEC (int *, &ia[1], , ++, 0, 1); TEST_INCDEC (int *, &ia[1], , --, 0, -1); } int main (void) { test_incdec (); exit (0); }