xref: /freebsd/lib/libc/tests/gen/limits_test.c (revision d59c7ea2701fe7b73b32eef49a7c712ef38de5a0)
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);
103 ATF_TC_BODY(dummy, tc) {}
104 
105 ATF_TP_ADD_TCS(tp)
106 {
107 	ATF_TP_ADD_TC(tp, dummy);
108 
109 	return (atf_no_error());
110 }
111