| /* Test for _Atomic in C11. Test of valid assignment cases for |
| arithmetic types. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-std=c11 -pedantic-errors" } */ |
| |
| #define TEST_ASSIGN(TYPE1, OP, TYPE2) \ |
| do \ |
| { \ |
| _Atomic TYPE1 a = 0; \ |
| TYPE2 b = 0; \ |
| _Atomic TYPE2 c = 0; \ |
| a OP b; \ |
| a OP c; \ |
| } \ |
| while (0) |
| |
| #define TEST_ASSIGN_ARITHR(TYPE1, OP) \ |
| do \ |
| { \ |
| TEST_ASSIGN (TYPE1, OP, _Bool); \ |
| TEST_ASSIGN (TYPE1, OP, char); \ |
| TEST_ASSIGN (TYPE1, OP, signed char); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned char); \ |
| TEST_ASSIGN (TYPE1, OP, signed short); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned short); \ |
| TEST_ASSIGN (TYPE1, OP, signed int); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned int); \ |
| TEST_ASSIGN (TYPE1, OP, signed long); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned long); \ |
| TEST_ASSIGN (TYPE1, OP, signed long long); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned long long); \ |
| TEST_ASSIGN (TYPE1, OP, float); \ |
| TEST_ASSIGN (TYPE1, OP, double); \ |
| TEST_ASSIGN (TYPE1, OP, long double); \ |
| TEST_ASSIGN (TYPE1, OP, _Complex float); \ |
| TEST_ASSIGN (TYPE1, OP, _Complex double); \ |
| TEST_ASSIGN (TYPE1, OP, _Complex long double); \ |
| } \ |
| while (0) |
| |
| #define TEST_ASSIGN_ARITHBOTH(OP) \ |
| do \ |
| { \ |
| TEST_ASSIGN_ARITHR (_Bool, OP); \ |
| TEST_ASSIGN_ARITHR (char, OP); \ |
| TEST_ASSIGN_ARITHR (signed char, OP); \ |
| TEST_ASSIGN_ARITHR (unsigned char, OP); \ |
| TEST_ASSIGN_ARITHR (signed short, OP); \ |
| TEST_ASSIGN_ARITHR (unsigned short, OP); \ |
| TEST_ASSIGN_ARITHR (signed int, OP); \ |
| TEST_ASSIGN_ARITHR (unsigned int, OP); \ |
| TEST_ASSIGN_ARITHR (signed long, OP); \ |
| TEST_ASSIGN_ARITHR (unsigned long, OP); \ |
| TEST_ASSIGN_ARITHR (signed long long, OP); \ |
| TEST_ASSIGN_ARITHR (unsigned long long, OP); \ |
| TEST_ASSIGN_ARITHR (float, OP); \ |
| TEST_ASSIGN_ARITHR (double, OP); \ |
| TEST_ASSIGN_ARITHR (long double, OP); \ |
| TEST_ASSIGN_ARITHR (_Complex float, OP); \ |
| TEST_ASSIGN_ARITHR (_Complex double, OP); \ |
| TEST_ASSIGN_ARITHR (_Complex long double, OP); \ |
| } \ |
| while (0) |
| |
| #define TEST_ASSIGN_INTR(TYPE1, OP) \ |
| do \ |
| { \ |
| TEST_ASSIGN (TYPE1, OP, _Bool); \ |
| TEST_ASSIGN (TYPE1, OP, char); \ |
| TEST_ASSIGN (TYPE1, OP, signed char); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned char); \ |
| TEST_ASSIGN (TYPE1, OP, signed short); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned short); \ |
| TEST_ASSIGN (TYPE1, OP, signed int); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned int); \ |
| TEST_ASSIGN (TYPE1, OP, signed long); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned long); \ |
| TEST_ASSIGN (TYPE1, OP, signed long long); \ |
| TEST_ASSIGN (TYPE1, OP, unsigned long long); \ |
| } \ |
| while (0) |
| |
| #define TEST_ASSIGN_INTBOTH(OP) \ |
| do \ |
| { \ |
| TEST_ASSIGN_INTR (_Bool, OP); \ |
| TEST_ASSIGN_INTR (char, OP); \ |
| TEST_ASSIGN_INTR (signed char, OP); \ |
| TEST_ASSIGN_INTR (unsigned char, OP); \ |
| TEST_ASSIGN_INTR (signed short, OP); \ |
| TEST_ASSIGN_INTR (unsigned short, OP); \ |
| TEST_ASSIGN_INTR (signed int, OP); \ |
| TEST_ASSIGN_INTR (unsigned int, OP); \ |
| TEST_ASSIGN_INTR (signed long, OP); \ |
| TEST_ASSIGN_INTR (unsigned long, OP); \ |
| TEST_ASSIGN_INTR (signed long long, OP); \ |
| TEST_ASSIGN_INTR (unsigned long long, OP); \ |
| } \ |
| while (0) |
| |
| void |
| test_simple (void) |
| { |
| TEST_ASSIGN_ARITHBOTH (=); |
| } |
| |
| void |
| test_mult (void) |
| { |
| TEST_ASSIGN_ARITHBOTH (*=); |
| } |
| |
| void |
| test_div (void) |
| { |
| TEST_ASSIGN_ARITHBOTH (/=); |
| } |
| |
| void |
| test_mod (void) |
| { |
| TEST_ASSIGN_INTBOTH (%=); |
| } |
| |
| void |
| test_plus (void) |
| { |
| TEST_ASSIGN_ARITHBOTH (+=); |
| } |
| |
| void |
| test_minus (void) |
| { |
| TEST_ASSIGN_ARITHBOTH (-=); |
| } |
| |
| void |
| test_lshift (void) |
| { |
| TEST_ASSIGN_INTBOTH (<<=); |
| } |
| |
| void |
| test_rshift (void) |
| { |
| TEST_ASSIGN_INTBOTH (>>=); |
| } |
| |
| void |
| test_and (void) |
| { |
| TEST_ASSIGN_INTBOTH (&=); |
| } |
| |
| void |
| test_xor (void) |
| { |
| TEST_ASSIGN_INTBOTH (^=); |
| } |
| |
| void |
| test_or (void) |
| { |
| TEST_ASSIGN_INTBOTH (|=); |
| } |