blob: e104e686a4f692e44d39eb4c7101a6b6ed102eb0 [file] [log] [blame]
/* Test C23 Checked Integer Arithmetic macros in <stdckdint.h>. */
/* { dg-do run } */
/* { dg-options "-std=c23" } */
#include <stdckdint.h>
#if __STDC_VERSION_STDCKDINT_H__ != 202311L
# error __STDC_VERSION_STDCKDINT_H__ not defined to 202311L
#endif
extern void abort (void);
int
main ()
{
unsigned int a;
if (ckd_add (&a, 1, 2) || a != 3)
abort ();
if (ckd_add (&a, ~2U, 2) || a != ~0U)
abort ();
if (!ckd_add (&a, ~2U, 4) || a != 1)
abort ();
if (ckd_sub (&a, 42, 2) || a != 40)
abort ();
if (!ckd_sub (&a, 11, ~0ULL) || a != 12)
abort ();
if (ckd_mul (&a, 42, 16U) || a != 672)
abort ();
if (ckd_mul (&a, ~0UL, 0) || a != 0)
abort ();
if (ckd_mul (&a, 1, ~0U) || a != ~0U)
abort ();
if (ckd_mul (&a, ~0UL, 1) != (~0UL > ~0U) || a != ~0U)
abort ();
static_assert (_Generic (ckd_add (&a, 1, 1), bool: 1, default: 0));
static_assert (_Generic (ckd_sub (&a, 1, 1), bool: 1, default: 0));
static_assert (_Generic (ckd_mul (&a, 1, 1), bool: 1, default: 0));
signed char b;
if (ckd_add (&b, 8, 12) || b != 20)
abort ();
if (ckd_sub (&b, 8UL, 12ULL) || b != -4)
abort ();
if (ckd_mul (&b, 2, 3) || b != 6)
abort ();
unsigned char c;
if (ckd_add (&c, 8, 12) || c != 20)
abort ();
if (ckd_sub (&c, 8UL, 12ULL) != (-4ULL > (unsigned char) -4U)
|| c != (unsigned char) -4U)
abort ();
if (ckd_mul (&c, 2, 3) || c != 6)
abort ();
long long d;
if (ckd_add (&d, ~0U, ~0U) != (~0U + 1ULL < ~0U)
|| d != (long long) (2 * (unsigned long long) ~0U))
abort ();
if (ckd_sub (&d, 0, 0) || d != 0)
abort ();
if (ckd_mul (&d, 16, 1) || d != 16)
abort ();
}