aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/stdckdint-1.c
blob: e104e686a4f692e44d39eb4c7101a6b6ed102eb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* 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 ();
}