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