/* Test C23 Checked Integer Arithmetic macros in . */ /* { dg-do run } */ /* { dg-options "-std=c2x" } */ #include #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 (); }