1 /*
2 * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
3 *
4 * SPDX-License-Identifier: FreeBSD-2-Clause
5 */
6
7 #include <assert.h>
8 #include <limits.h>
9 #include <signal.h>
10 #include <stdint.h>
11 #include <wchar.h>
12
13 #include <atf-c.h>
14
15 /* if this file builds, the unit tests have passed */
16 #define CHECK_STYPE(type, TYPE) \
17 static_assert(sizeof(type) * CHAR_BIT == TYPE ## _WIDTH, \
18 __XSTRING(TYPE) "_WIDTH wrongly defined"); \
19 static_assert((1ULL << (TYPE ## _WIDTH - 1)) - 1 == TYPE ## _MAX, \
20 __XSTRING(TYPE) "_MAX wrongly defined"); \
21 static_assert(TYPE ## _MIN == -TYPE ## _MAX - 1, \
22 __XSTRING(TYPE) "_MIN wrongly defined")
23 #define CHECK_UTYPE(type, TYPE) \
24 static_assert(sizeof(type) * CHAR_BIT == TYPE ## _WIDTH, \
25 __XSTRING(TYPE) "_WIDTH wrongly defined"); \
26 static_assert((type)~0ULL == TYPE ## _MAX, \
27 __XSTRING(TYPE) "_MAX wrongly defined");
28
29 /* primitive types */
30 static_assert(BOOL_WIDTH == 1, "BOOL_WIDTH wrongly defined");
31 static_assert(BOOL_MAX == 1, "BOOL_MAX wrongly defined");
32
33 #ifdef __CHAR_UNSIGNED__
34 CHECK_UTYPE(char, CHAR);
35 #else
36 CHECK_STYPE(char, CHAR);
37 #endif
38
39 CHECK_STYPE(signed char, SCHAR);
40 CHECK_STYPE(short, SHRT);
41 CHECK_STYPE(int, INT);
42 CHECK_STYPE(long, LONG);
43 CHECK_STYPE(long long, LLONG);
44
45 CHECK_UTYPE(unsigned char, UCHAR);
46 CHECK_UTYPE(unsigned short, USHRT);
47 CHECK_UTYPE(unsigned int, UINT);
48 CHECK_UTYPE(unsigned long, ULONG);
49 CHECK_UTYPE(unsigned long long, ULLONG);
50
51 /* fixed-width types */
52 CHECK_STYPE(int8_t, INT8);
53 CHECK_STYPE(int16_t, INT16);
54 CHECK_STYPE(int32_t, INT32);
55 CHECK_STYPE(int64_t, INT64);
56
57 CHECK_UTYPE(uint8_t, UINT8);
58 CHECK_UTYPE(uint16_t, UINT16);
59 CHECK_UTYPE(uint32_t, UINT32);
60 CHECK_UTYPE(uint64_t, UINT64);
61
62 CHECK_STYPE(int_least8_t, INT_LEAST8);
63 CHECK_STYPE(int_least16_t, INT_LEAST16);
64 CHECK_STYPE(int_least32_t, INT_LEAST32);
65 CHECK_STYPE(int_least64_t, INT_LEAST64);
66
67 CHECK_UTYPE(uint_least8_t, UINT_LEAST8);
68 CHECK_UTYPE(uint_least16_t, UINT_LEAST16);
69 CHECK_UTYPE(uint_least32_t, UINT_LEAST32);
70 CHECK_UTYPE(uint_least64_t, UINT_LEAST64);
71
72 CHECK_STYPE(int_fast8_t, INT_FAST8);
73 CHECK_STYPE(int_fast16_t, INT_FAST16);
74 CHECK_STYPE(int_fast32_t, INT_FAST32);
75 CHECK_STYPE(int_fast64_t, INT_FAST64);
76
77 CHECK_UTYPE(uint_fast8_t, UINT_FAST8);
78 CHECK_UTYPE(uint_fast16_t, UINT_FAST16);
79 CHECK_UTYPE(uint_fast32_t, UINT_FAST32);
80 CHECK_UTYPE(uint_fast64_t, UINT_FAST64);
81
82 /* other types */
83 #if WCHAR_MIN == 0
84 CHECK_UTYPE(wchar_t, WCHAR);
85 #else
86 CHECK_STYPE(wchar_t, WCHAR);
87 #endif
88 CHECK_STYPE(intmax_t, INTMAX);
89 CHECK_STYPE(intptr_t, INTPTR);
90 CHECK_STYPE(ptrdiff_t, PTRDIFF);
91 CHECK_STYPE(wint_t, WINT);
92 CHECK_STYPE(sig_atomic_t, SIG_ATOMIC);
93
94 CHECK_UTYPE(uintmax_t, UINTMAX);
95 CHECK_UTYPE(uintptr_t, UINTPTR);
96 CHECK_UTYPE(size_t, SIZE);
97
98 static_assert(BITINT_MAXWIDTH >= ULLONG_WIDTH,
99 "BITINT_MAXWIDTH wrongly defined");
100
101 /* dummy */
102 ATF_TC_WITHOUT_HEAD(dummy);
ATF_TC_BODY(dummy,tc)103 ATF_TC_BODY(dummy, tc) {}
104
ATF_TP_ADD_TCS(tp)105 ATF_TP_ADD_TCS(tp)
106 {
107 ATF_TP_ADD_TC(tp, dummy);
108
109 return (atf_no_error());
110 }
111