blob: 7bfa8c05f96cf73e5f29dc1c8cdd759edb79176f [file] [log] [blame]
/* 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);
}