blob: 0a4fa0165b0bb112dc78ffed021b609efeaa1677 [file] [log] [blame]
/* PR sanitizer/69099 */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic-errors -fsanitize=float-cast-overflow" } */
/* This is gcc.dg/atomic/c11-atomic-exec-2.c. */
extern void abort (void);
extern void exit (int);
#define CMPLX(X, Y) __builtin_complex ((X), (Y))
#define TEST_COMPOUND(TYPE, LHSVAL, RHSVAL, OP) \
do \
{ \
static volatile _Atomic (TYPE) a = (TYPE) (LHSVAL); \
if ((a OP##= (RHSVAL)) != (TYPE) ((TYPE) (LHSVAL) OP (RHSVAL))) \
abort (); \
if (a != (TYPE) ((TYPE) (LHSVAL) OP (RHSVAL))) \
abort (); \
} \
while (0)
#define TEST_COMPOUND_ARITH(LHSVAL, RHSVAL, OP) \
do \
{ \
TEST_COMPOUND (_Bool, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (char, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed char, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned char, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed short, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned short, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed int, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned int, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed long long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned long long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (float, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (double, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (long double, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (_Complex float, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (_Complex double, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (_Complex long double, (LHSVAL), (RHSVAL), OP); \
} \
while (0)
#define TEST_COMPOUND_INT(LHSVAL, RHSVAL, OP) \
do \
{ \
TEST_COMPOUND (_Bool, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (char, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed char, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned char, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed short, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned short, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed int, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned int, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (signed long long, (LHSVAL), (RHSVAL), OP); \
TEST_COMPOUND (unsigned long long, (LHSVAL), (RHSVAL), OP); \
} \
while (0)
static void
test_mult (void)
{
TEST_COMPOUND_ARITH (1, 2, *);
TEST_COMPOUND_ARITH (-3, 5, *);
TEST_COMPOUND_ARITH (-7, -20, *);
TEST_COMPOUND_ARITH (1.25, 3.5, *);
TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), CMPLX (3.5, 4.5), *);
TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), 2, *);
}
static void
test_div (void)
{
TEST_COMPOUND_ARITH (1, 2, /);
TEST_COMPOUND_ARITH (-6, 3, /);
TEST_COMPOUND_ARITH (-70, -10, /);
TEST_COMPOUND_ARITH (1.25, 2.5, /);
TEST_COMPOUND_ARITH (CMPLX (1.0, 1.0), CMPLX (0.5, 0.5), /);
TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), 2, /);
}
static void
test_mod (void)
{
TEST_COMPOUND_INT (1, 2, %);
TEST_COMPOUND_INT (-3, 5, %);
TEST_COMPOUND_INT (-7, -2, %);
}
static void
test_plus (void)
{
TEST_COMPOUND_ARITH (1, 2, +);
TEST_COMPOUND_ARITH (-3, 5, +);
TEST_COMPOUND_ARITH (-7, -20, +);
TEST_COMPOUND_ARITH (1.25, 3.5, +);
TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), CMPLX (3.5, 4.5), +);
TEST_COMPOUND_ARITH (CMPLX (1.5, 2.5), 2, +);
static int ia[2];
TEST_COMPOUND (int *, &ia[1], 1, +);
TEST_COMPOUND (int *, &ia[1], -1, +);
}
static void
test_minus (void)
{
TEST_COMPOUND_ARITH (1, 2, -);
TEST_COMPOUND_ARITH (-3, 5, -);
TEST_COMPOUND_ARITH (-7, -20, -);
TEST_COMPOUND_ARITH (3.5, 1.25, -);
TEST_COMPOUND_ARITH (CMPLX (3.5, 4.5), CMPLX (1.5, 2.5), -);
TEST_COMPOUND_ARITH (CMPLX (3.5, 2.5), 2, -);
static int ia[2];
TEST_COMPOUND (int *, &ia[1], 1, -);
TEST_COMPOUND (int *, &ia[1], -1, -);
}
static void
test_lshift (void)
{
TEST_COMPOUND_INT (1, 7, <<);
TEST_COMPOUND_INT (15, 3, <<);
}
static void
test_rshift (void)
{
TEST_COMPOUND_INT (1, 1, >>);
TEST_COMPOUND_INT (127, 4, >>);
}
static void
test_and (void)
{
TEST_COMPOUND_INT (0x1234, 0x7856, &);
TEST_COMPOUND_INT (-1, 0x12345678, &);
}
static void
test_xor (void)
{
TEST_COMPOUND_INT (0x1234, 0x7856, ^);
TEST_COMPOUND_INT (-1, 0x12345678, ^);
}
static void
test_or (void)
{
TEST_COMPOUND_INT (0x1234, 0x7856, |);
TEST_COMPOUND_INT (-12345, 0x12345678, |);
}
int
main (void)
{
test_mult ();
test_div ();
test_mod ();
test_plus ();
test_minus ();
test_lshift ();
test_rshift ();
test_and ();
test_xor ();
test_or ();
exit (0);
}