1 /* Test integer width macros in <stdint.h>.
2 Copyright (C) 2016-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19 #include <signal.h>
20 #include <stddef.h>
21 #include <stdint.h>
22 #include <stdio.h>
23 #include <wchar.h>
24
25 #define CHECK_WIDTH(TYPE, MAX, WIDTH) \
26 do \
27 { \
28 if ((MAX >> ((TYPE) -1 < 0 ? (WIDTH - 2) : (WIDTH - 1))) != 1) \
29 { \
30 puts ("bad width of " #TYPE); \
31 result = 1; \
32 } \
33 else \
34 puts ("width of " #TYPE " OK"); \
35 } \
36 while (0)
37
38 static int
do_test(void)39 do_test (void)
40 {
41 int result = 0;
42
43 #ifndef INT8_WIDTH
44 # error "missing INT8_WIDTH"
45 #endif
46 CHECK_WIDTH (int8_t, INT8_MAX, INT8_WIDTH);
47 #ifndef INT16_WIDTH
48 # error "missing INT16_WIDTH"
49 #endif
50 CHECK_WIDTH (int16_t, INT16_MAX, INT16_WIDTH);
51 #ifndef INT32_WIDTH
52 # error "missing INT32_WIDTH"
53 #endif
54 CHECK_WIDTH (int32_t, INT32_MAX, INT32_WIDTH);
55 #ifndef INT64_WIDTH
56 # error "missing INT64_WIDTH"
57 #endif
58 CHECK_WIDTH (int64_t, INT64_MAX, INT64_WIDTH);
59 #ifndef UINT8_WIDTH
60 # error "missing UINT8_WIDTH"
61 #endif
62 CHECK_WIDTH (uint8_t, UINT8_MAX, UINT8_WIDTH);
63 #ifndef UINT16_WIDTH
64 # error "missing UINT16_WIDTH"
65 #endif
66 CHECK_WIDTH (uint16_t, UINT16_MAX, UINT16_WIDTH);
67 #ifndef UINT32_WIDTH
68 # error "missing UINT32_WIDTH"
69 #endif
70 CHECK_WIDTH (uint32_t, UINT32_MAX, UINT32_WIDTH);
71 #ifndef UINT64_WIDTH
72 # error "missing UINT64_WIDTH"
73 #endif
74 CHECK_WIDTH (uint64_t, UINT64_MAX, UINT64_WIDTH);
75
76 #ifndef INT_LEAST8_WIDTH
77 # error "missing INT_LEAST8_WIDTH"
78 #endif
79 CHECK_WIDTH (int_least8_t, INT_LEAST8_MAX, INT_LEAST8_WIDTH);
80 #ifndef INT_LEAST16_WIDTH
81 # error "missing INT_LEAST16_WIDTH"
82 #endif
83 CHECK_WIDTH (int_least16_t, INT_LEAST16_MAX, INT_LEAST16_WIDTH);
84 #ifndef INT_LEAST32_WIDTH
85 # error "missing INT_LEAST32_WIDTH"
86 #endif
87 CHECK_WIDTH (int_least32_t, INT_LEAST32_MAX, INT_LEAST32_WIDTH);
88 #ifndef INT_LEAST64_WIDTH
89 # error "missing INT_LEAST64_WIDTH"
90 #endif
91 CHECK_WIDTH (int_least64_t, INT_LEAST64_MAX, INT_LEAST64_WIDTH);
92 #ifndef UINT_LEAST8_WIDTH
93 # error "missing UINT_LEAST8_WIDTH"
94 #endif
95 CHECK_WIDTH (uint_least8_t, UINT_LEAST8_MAX, UINT_LEAST8_WIDTH);
96 #ifndef UINT_LEAST16_WIDTH
97 # error "missing UINT_LEAST16_WIDTH"
98 #endif
99 CHECK_WIDTH (uint_least16_t, UINT_LEAST16_MAX, UINT_LEAST16_WIDTH);
100 #ifndef UINT_LEAST32_WIDTH
101 # error "missing UINT_LEAST32_WIDTH"
102 #endif
103 CHECK_WIDTH (uint_least32_t, UINT_LEAST32_MAX, UINT_LEAST32_WIDTH);
104 #ifndef UINT_LEAST64_WIDTH
105 # error "missing UINT_LEAST64_WIDTH"
106 #endif
107 CHECK_WIDTH (uint_least64_t, UINT_LEAST64_MAX, UINT_LEAST64_WIDTH);
108
109 #ifndef INT_FAST8_WIDTH
110 # error "missing INT_FAST8_WIDTH"
111 #endif
112 CHECK_WIDTH (int_fast8_t, INT_FAST8_MAX, INT_FAST8_WIDTH);
113 #ifndef INT_FAST16_WIDTH
114 # error "missing INT_FAST16_WIDTH"
115 #endif
116 CHECK_WIDTH (int_fast16_t, INT_FAST16_MAX, INT_FAST16_WIDTH);
117 #ifndef INT_FAST32_WIDTH
118 # error "missing INT_FAST32_WIDTH"
119 #endif
120 CHECK_WIDTH (int_fast32_t, INT_FAST32_MAX, INT_FAST32_WIDTH);
121 #ifndef INT_FAST64_WIDTH
122 # error "missing INT_FAST64_WIDTH"
123 #endif
124 CHECK_WIDTH (int_fast64_t, INT_FAST64_MAX, INT_FAST64_WIDTH);
125 #ifndef UINT_FAST8_WIDTH
126 # error "missing UINT_FAST8_WIDTH"
127 #endif
128 CHECK_WIDTH (uint_fast8_t, UINT_FAST8_MAX, UINT_FAST8_WIDTH);
129 #ifndef UINT_FAST16_WIDTH
130 # error "missing UINT_FAST16_WIDTH"
131 #endif
132 CHECK_WIDTH (uint_fast16_t, UINT_FAST16_MAX, UINT_FAST16_WIDTH);
133 #ifndef UINT_FAST32_WIDTH
134 # error "missing UINT_FAST32_WIDTH"
135 #endif
136 CHECK_WIDTH (uint_fast32_t, UINT_FAST32_MAX, UINT_FAST32_WIDTH);
137 #ifndef UINT_FAST64_WIDTH
138 # error "missing UINT_FAST64_WIDTH"
139 #endif
140 CHECK_WIDTH (uint_fast64_t, UINT_FAST64_MAX, UINT_FAST64_WIDTH);
141
142 #ifndef INTPTR_WIDTH
143 # error "missing INTPTR_WIDTH"
144 #endif
145 CHECK_WIDTH (intptr_t, INTPTR_MAX, INTPTR_WIDTH);
146 #ifndef UINTPTR_WIDTH
147 # error "missing UINTPTR_WIDTH"
148 #endif
149 CHECK_WIDTH (uintptr_t, UINTPTR_MAX, UINTPTR_WIDTH);
150
151 #ifndef INTMAX_WIDTH
152 # error "missing INTMAX_WIDTH"
153 #endif
154 CHECK_WIDTH (intmax_t, INTMAX_MAX, INTMAX_WIDTH);
155 #ifndef UINTMAX_WIDTH
156 # error "missing UINTMAX_WIDTH"
157 #endif
158 CHECK_WIDTH (uintmax_t, UINTMAX_MAX, UINTMAX_WIDTH);
159
160 #ifndef PTRDIFF_WIDTH
161 # error "missing PTRDIFF_WIDTH"
162 #endif
163 CHECK_WIDTH (ptrdiff_t, PTRDIFF_MAX, PTRDIFF_WIDTH);
164 #ifndef SIG_ATOMIC_WIDTH
165 # error "missing SIG_ATOMIC_WIDTH"
166 #endif
167 CHECK_WIDTH (sig_atomic_t, SIG_ATOMIC_MAX, SIG_ATOMIC_WIDTH);
168 #ifndef SIZE_WIDTH
169 # error "missing SIZE_WIDTH"
170 #endif
171 CHECK_WIDTH (size_t, SIZE_MAX, SIZE_WIDTH);
172 #ifndef WCHAR_WIDTH
173 # error "missing WCHAR_WIDTH"
174 #endif
175 CHECK_WIDTH (wchar_t, WCHAR_MAX, WCHAR_WIDTH);
176 #ifndef WINT_WIDTH
177 # error "missing WINT_WIDTH"
178 #endif
179 CHECK_WIDTH (wint_t, WINT_MAX, WINT_WIDTH);
180
181 return result;
182 }
183
184 #define TEST_FUNCTION do_test ()
185 #include "../test-skeleton.c"
186