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