diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/atomic/c11-atomic-exec-3.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/atomic/c11-atomic-exec-3.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/atomic/c11-atomic-exec-3.c b/gcc/testsuite/gcc.dg/atomic/c11-atomic-exec-3.c new file mode 100644 index 00000000000..7bfa8c05f96 --- /dev/null +++ b/gcc/testsuite/gcc.dg/atomic/c11-atomic-exec-3.c @@ -0,0 +1,85 @@ +/* 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); +} |