xref: /freebsd/lib/libc/tests/gen/limits_test.c (revision 6296500a85c8474e3ff3fe2f8e4a9d56dd0acd64)
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 #ifdef __CHAR_UNSIGNED__
31 CHECK_UTYPE(char, CHAR);
32 #else
33 CHECK_STYPE(char, CHAR);
34 #endif
35 
36 CHECK_STYPE(signed char, SCHAR);
37 CHECK_STYPE(short, SHRT);
38 CHECK_STYPE(int, INT);
39 CHECK_STYPE(long, LONG);
40 CHECK_STYPE(long long, LLONG);
41 
42 CHECK_UTYPE(unsigned char, UCHAR);
43 CHECK_UTYPE(unsigned short, USHRT);
44 CHECK_UTYPE(unsigned int, UINT);
45 CHECK_UTYPE(unsigned long, ULONG);
46 CHECK_UTYPE(unsigned long long, ULLONG);
47 
48 /* fixed-width types */
49 CHECK_STYPE(int8_t, INT8);
50 CHECK_STYPE(int16_t, INT16);
51 CHECK_STYPE(int32_t, INT32);
52 CHECK_STYPE(int64_t, INT64);
53 
54 CHECK_UTYPE(uint8_t, UINT8);
55 CHECK_UTYPE(uint16_t, UINT16);
56 CHECK_UTYPE(uint32_t, UINT32);
57 CHECK_UTYPE(uint64_t, UINT64);
58 
59 CHECK_STYPE(int_least8_t, INT_LEAST8);
60 CHECK_STYPE(int_least16_t, INT_LEAST16);
61 CHECK_STYPE(int_least32_t, INT_LEAST32);
62 CHECK_STYPE(int_least64_t, INT_LEAST64);
63 
64 CHECK_UTYPE(uint_least8_t, UINT_LEAST8);
65 CHECK_UTYPE(uint_least16_t, UINT_LEAST16);
66 CHECK_UTYPE(uint_least32_t, UINT_LEAST32);
67 CHECK_UTYPE(uint_least64_t, UINT_LEAST64);
68 
69 CHECK_STYPE(int_fast8_t, INT_FAST8);
70 CHECK_STYPE(int_fast16_t, INT_FAST16);
71 CHECK_STYPE(int_fast32_t, INT_FAST32);
72 CHECK_STYPE(int_fast64_t, INT_FAST64);
73 
74 CHECK_UTYPE(uint_fast8_t, UINT_FAST8);
75 CHECK_UTYPE(uint_fast16_t, UINT_FAST16);
76 CHECK_UTYPE(uint_fast32_t, UINT_FAST32);
77 CHECK_UTYPE(uint_fast64_t, UINT_FAST64);
78 
79 /* other types */
80 #if WCHAR_MIN == 0
81 CHECK_UTYPE(wchar_t, WCHAR);
82 #else
83 CHECK_STYPE(wchar_t, WCHAR);
84 #endif
85 CHECK_STYPE(intmax_t, INTMAX);
86 CHECK_STYPE(intptr_t, INTPTR);
87 CHECK_STYPE(ptrdiff_t, PTRDIFF);
88 CHECK_STYPE(wint_t, WINT);
89 CHECK_STYPE(sig_atomic_t, SIG_ATOMIC);
90 
91 CHECK_UTYPE(uintmax_t, UINTMAX);
92 CHECK_UTYPE(uintptr_t, UINTPTR);
93 CHECK_UTYPE(size_t, SIZE);
94 
95 /* dummy */
96 ATF_TP_ADD_TCS(tp)
97 {
98 	(void)tp;
99 
100 	return (atf_no_error());
101 }
102