1/* Verify that <stdint.h> is present and follows the C99 requirements.
2   If this test fails because of the header being missing on a
3   particular target, this indicates GCC has not been correctly
4   configured regarding what version of <stdint.h> to install or what
5   the <stdint.h> types are on that target.  If GCC is wrapping a
6   system copy of the header and some tests fail because of bugs in
7   that copy, they should be fixed with fixincludes (and the bugs
8   reported to maintainer of that copy if still present in the latest
9   version).  */
10/* { dg-do compile } */
11/* { dg-options "-std=iso9899:1999 -pedantic-errors -fhosted" } */
12/* { dg-require-effective-target ptr32plus } */
13
14#include <limits.h>
15#include <stdint.h>
16/* This and the later SIG_ATOMIC_* tests should be appropriately
17   conditioned for any freestanding targets with no <signal.h>.  */
18#ifndef SIGNAL_SUPPRESS
19#include <signal.h>
20#endif
21
22/* Note that some of these conditions assume two's complement and no
23   padding bits; GCC only supports two's complement, and no supported
24   target has padding bits in any integer type of the standard
25   widths.  */
26#define CHECK_SIGNED(TYPE) \
27  do { TYPE a; int b[(TYPE)-1 < 0 ? 1 : -1]; } while (0)
28#define CHECK_UNSIGNED(TYPE) \
29  do { TYPE a; int b[(TYPE)-1 < 0 ? -1 : 1]; } while (0)
30#define CHECK_WIDTH_EQUALS(TYPE, WIDTH) \
31  do { int a[sizeof(TYPE) * CHAR_BIT == (WIDTH) ? 1 : -1]; } while (0)
32#define CHECK_WIDTH_AT_LEAST(TYPE, WIDTH) \
33  do { int a[sizeof(TYPE) * CHAR_BIT >= (WIDTH) ? 1 : -1]; } while (0)
34#define CHECK_WIDTH_ORDER(TYPE1, TYPE2) \
35  do { int a[sizeof(TYPE2) >= sizeof(TYPE1) ? 1 : -1]; } while (0)
36#define CHECK_EXPR_TYPE(TYPE, EXPR) \
37  do { __typeof__(EXPR) a; __typeof__((TYPE)0 + 0) *b = &a; } while (0)
38#define UNSIGNED_MAX_COND(TYPE, EXPR) \
39  ((EXPR) == (TYPE)-1)
40#define SIGNED_MIN_MAX_COND(TYPE, MIN, MAX)				\
41  ((MIN) == -(MAX)-1							\
42   && ((MAX) & 1)							\
43   && ((((MAX) >> 1) + 1) >> (sizeof(TYPE) * CHAR_BIT - 2)) == 1)
44#define MIN_MAX_COND(TYPE, MIN, MAX)			\
45  ((TYPE)-1 < 0						\
46   ? SIGNED_MIN_MAX_COND(TYPE, (MIN), (MAX))		\
47   : ((MIN) == 0 && UNSIGNED_MAX_COND(TYPE, (MAX))))
48#define CHECK_SIGNED_LIMITS(TYPE, MIN, MAX)				\
49  CHECK_SIGNED(TYPE);							\
50  CHECK_EXPR_TYPE(TYPE, (MIN));						\
51  CHECK_EXPR_TYPE(TYPE, (MAX));						\
52  do { int a[SIGNED_MIN_MAX_COND(TYPE, (MIN), (MAX)) ? 1 : -1]; } while (0)
53#define CHECK_SIGNED_LIMITS_2(TYPE, MIN, MAX, MINBD, MAXBD)	\
54  CHECK_SIGNED(TYPE);						\
55  CHECK_EXPR_TYPE(TYPE, (MIN));					\
56  CHECK_EXPR_TYPE(TYPE, (MAX));					\
57  do { int a[(SIGNED_MIN_MAX_COND(TYPE, (MIN), (MAX))		\
58	      && (MIN) <= (MINBD)				\
59	      && (MAX) >= (MAXBD)) ? 1 : -1]; } while (0)
60#define CHECK_UNSIGNED_LIMITS(TYPE, MAX)				\
61  CHECK_UNSIGNED(TYPE);							\
62  CHECK_EXPR_TYPE(TYPE, (MAX));						\
63  do { int a[UNSIGNED_MAX_COND(TYPE, (MAX)) ? 1 : -1]; } while (0)
64#define CHECK_UNSIGNED_LIMITS_2(TYPE, MAX, MAXBD)		\
65  CHECK_UNSIGNED(TYPE);						\
66  CHECK_EXPR_TYPE(TYPE, (MAX));					\
67  do { int a[(UNSIGNED_MAX_COND(TYPE, (MAX))			\
68	      && (MAX) >= (MAXBD)) ? 1 : -1]; } while (0)
69#define CHECK_LIMITS_2(TYPE, MIN, MAX, SMINBD, SMAXBD, UMAXBD)	\
70  do { int a[(MIN_MAX_COND(TYPE, (MIN), (MAX))			\
71	      && ((TYPE)-1 < 0					\
72		  ? ((MIN) <= (SMINBD) && (MAX) >= (SMAXBD))	\
73		  : (MAX) >= (UMAXBD))) ? 1 : -1]; } while (0)
74#define CHECK_CONSTS(TYPE, MACRO)				\
75  CHECK_EXPR_TYPE(TYPE, MACRO(01));				\
76  CHECK_EXPR_TYPE(TYPE, MACRO(2));				\
77  CHECK_EXPR_TYPE(TYPE, MACRO(0x3));				\
78  do { int a[(MACRO(12) == 12					\
79	      && MACRO(012) == 012				\
80	      && MACRO(0x12) == 0x12) ? 1 : -1]; } while (0);
81
82void
83test_exact (void)
84{
85#ifdef INT8_MIN
86  CHECK_WIDTH_EQUALS(int8_t, 8);
87  CHECK_SIGNED_LIMITS(int8_t, INT8_MIN, INT8_MAX);
88#else
89  CHECK_WIDTH_AT_LEAST(int_least8_t, 9);
90#endif
91#ifdef INT16_MIN
92  CHECK_WIDTH_EQUALS(int16_t, 16);
93  CHECK_SIGNED_LIMITS(int16_t, INT16_MIN, INT16_MAX);
94#else
95  CHECK_WIDTH_AT_LEAST(int_least16_t, 17);
96#endif
97#ifdef INT32_MIN
98  CHECK_WIDTH_EQUALS(int32_t, 32);
99  CHECK_SIGNED_LIMITS(int32_t, INT32_MIN, INT32_MAX);
100#else
101  CHECK_WIDTH_AT_LEAST(int_least32_t, 33);
102#endif
103#ifdef INT64_MIN
104  CHECK_WIDTH_EQUALS(int64_t, 64);
105  CHECK_SIGNED_LIMITS(int64_t, INT64_MIN, INT64_MAX);
106#else
107  CHECK_WIDTH_AT_LEAST(int_least64_t, 65);
108#endif
109#ifdef UINT8_MAX
110  CHECK_WIDTH_EQUALS(uint8_t, 8);
111  CHECK_UNSIGNED_LIMITS(uint8_t, UINT8_MAX);
112#else
113  CHECK_WIDTH_AT_LEAST(uint_least8_t, 9);
114#endif
115#ifdef UINT16_MAX
116  CHECK_WIDTH_EQUALS(uint16_t, 16);
117  CHECK_UNSIGNED_LIMITS(uint16_t, UINT16_MAX);
118#else
119  CHECK_WIDTH_AT_LEAST(uint_least16_t, 17);
120#endif
121#ifdef UINT32_MAX
122  CHECK_WIDTH_EQUALS(uint32_t, 32);
123  CHECK_UNSIGNED_LIMITS(uint32_t, UINT32_MAX);
124#else
125  CHECK_WIDTH_AT_LEAST(uint_least32_t, 33);
126#endif
127#ifdef UINT64_MAX
128  CHECK_WIDTH_EQUALS(uint64_t, 64);
129  CHECK_UNSIGNED_LIMITS(uint64_t, UINT64_MAX);
130#else
131  CHECK_WIDTH_AT_LEAST(uint_least64_t, 65);
132#endif
133}
134
135void
136test_least (void)
137{
138  CHECK_WIDTH_AT_LEAST(int_least8_t, 8);
139  CHECK_WIDTH_ORDER(int_least8_t, int_fast8_t);
140  CHECK_SIGNED_LIMITS(int_least8_t, INT_LEAST8_MIN, INT_LEAST8_MAX);
141  CHECK_WIDTH_AT_LEAST(int_least16_t, 16);
142  CHECK_WIDTH_ORDER(int_least16_t, int_fast16_t);
143  CHECK_SIGNED_LIMITS(int_least16_t, INT_LEAST16_MIN, INT_LEAST16_MAX);
144  CHECK_WIDTH_AT_LEAST(int_least32_t, 32);
145  CHECK_WIDTH_ORDER(int_least32_t, int_fast32_t);
146  CHECK_SIGNED_LIMITS(int_least32_t, INT_LEAST32_MIN, INT_LEAST32_MAX);
147  CHECK_WIDTH_AT_LEAST(int_least64_t, 64);
148  CHECK_WIDTH_ORDER(int_least64_t, int_fast64_t);
149  CHECK_SIGNED_LIMITS(int_least64_t, INT_LEAST64_MIN, INT_LEAST64_MAX);
150  CHECK_WIDTH_AT_LEAST(uint_least8_t, 8);
151  CHECK_WIDTH_ORDER(uint_least8_t, uint_fast8_t);
152  CHECK_UNSIGNED_LIMITS(uint_least8_t, UINT_LEAST8_MAX);
153  CHECK_WIDTH_AT_LEAST(uint_least16_t, 16);
154  CHECK_WIDTH_ORDER(uint_least16_t, uint_fast16_t);
155  CHECK_UNSIGNED_LIMITS(uint_least16_t, UINT_LEAST16_MAX);
156  CHECK_WIDTH_AT_LEAST(uint_least32_t, 32);
157  CHECK_WIDTH_ORDER(uint_least32_t, uint_fast32_t);
158  CHECK_UNSIGNED_LIMITS(uint_least32_t, UINT_LEAST32_MAX);
159  CHECK_WIDTH_AT_LEAST(uint_least64_t, 64);
160  CHECK_WIDTH_ORDER(uint_least64_t, uint_fast64_t);
161  CHECK_UNSIGNED_LIMITS(uint_least64_t, UINT_LEAST64_MAX);
162}
163
164void
165test_fast (void)
166{
167  CHECK_WIDTH_AT_LEAST(int_fast8_t, 8);
168  CHECK_SIGNED_LIMITS(int_fast8_t, INT_FAST8_MIN, INT_FAST8_MAX);
169  CHECK_WIDTH_AT_LEAST(int_fast16_t, 16);
170  CHECK_SIGNED_LIMITS(int_fast16_t, INT_FAST16_MIN, INT_FAST16_MAX);
171  CHECK_WIDTH_AT_LEAST(int_fast32_t, 32);
172  CHECK_SIGNED_LIMITS(int_fast32_t, INT_FAST32_MIN, INT_FAST32_MAX);
173  CHECK_WIDTH_AT_LEAST(int_fast64_t, 64);
174  CHECK_SIGNED_LIMITS(int_fast64_t, INT_FAST64_MIN, INT_FAST64_MAX);
175  CHECK_WIDTH_AT_LEAST(uint_fast8_t, 8);
176  CHECK_UNSIGNED_LIMITS(uint_fast8_t, UINT_FAST8_MAX);
177  CHECK_WIDTH_AT_LEAST(uint_fast16_t, 16);
178  CHECK_UNSIGNED_LIMITS(uint_fast16_t, UINT_FAST16_MAX);
179  CHECK_WIDTH_AT_LEAST(uint_fast32_t, 32);
180  CHECK_UNSIGNED_LIMITS(uint_fast32_t, UINT_FAST32_MAX);
181  CHECK_WIDTH_AT_LEAST(uint_fast64_t, 64);
182  CHECK_UNSIGNED_LIMITS(uint_fast64_t, UINT_FAST64_MAX);
183}
184
185void
186test_ptr (void)
187{
188#ifdef INTPTR_MIN
189  CHECK_SIGNED_LIMITS_2(intptr_t, INTPTR_MIN, INTPTR_MAX, -0x7fff, 0x7fff);
190#endif
191#ifdef UINTPTR_MAX
192  CHECK_UNSIGNED_LIMITS_2(uintptr_t, UINTPTR_MAX, 0xffffU);
193#endif
194}
195
196void
197test_max (void)
198{
199  CHECK_WIDTH_AT_LEAST(intmax_t, 64);
200  CHECK_WIDTH_ORDER(long long, intmax_t);
201  CHECK_WIDTH_ORDER(int_fast8_t, intmax_t);
202  CHECK_WIDTH_ORDER(int_fast16_t, intmax_t);
203  CHECK_WIDTH_ORDER(int_fast32_t, intmax_t);
204  CHECK_WIDTH_ORDER(int_fast64_t, intmax_t);
205  CHECK_SIGNED_LIMITS(intmax_t, INTMAX_MIN, INTMAX_MAX);
206  CHECK_WIDTH_AT_LEAST(uintmax_t, 64);
207  CHECK_WIDTH_ORDER(unsigned long long, uintmax_t);
208  CHECK_WIDTH_ORDER(uint_fast8_t, uintmax_t);
209  CHECK_WIDTH_ORDER(uint_fast16_t, uintmax_t);
210  CHECK_WIDTH_ORDER(uint_fast32_t, uintmax_t);
211  CHECK_WIDTH_ORDER(uint_fast64_t, uintmax_t);
212  CHECK_UNSIGNED_LIMITS(uintmax_t, UINTMAX_MAX);
213}
214
215void
216test_misc_limits (void)
217{
218  CHECK_SIGNED_LIMITS_2(__PTRDIFF_TYPE__, PTRDIFF_MIN, PTRDIFF_MAX, -65535L, 65535L);
219#ifndef SIGNAL_SUPPRESS
220  CHECK_LIMITS_2(sig_atomic_t, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX, -127, 127, 255);
221#endif
222  CHECK_UNSIGNED_LIMITS_2(__SIZE_TYPE__, SIZE_MAX, 65535U);
223  CHECK_LIMITS_2(__WCHAR_TYPE__, WCHAR_MIN, WCHAR_MAX, -127, 127, 255);
224  CHECK_LIMITS_2(__WINT_TYPE__, WINT_MIN, WINT_MAX, -32767, 32767, 65535);
225}
226
227void
228test_constants (void)
229{
230  CHECK_CONSTS(int_least8_t, INT8_C);
231  CHECK_CONSTS(int_least16_t, INT16_C);
232  CHECK_CONSTS(int_least32_t, INT32_C);
233  CHECK_CONSTS(int_least64_t, INT64_C);
234  CHECK_CONSTS(intmax_t, INTMAX_C);
235  CHECK_CONSTS(uint_least8_t, UINT8_C);
236  CHECK_CONSTS(uint_least16_t, UINT16_C);
237  CHECK_CONSTS(uint_least32_t, UINT32_C);
238  CHECK_CONSTS(uint_least64_t, UINT64_C);
239  CHECK_CONSTS(uintmax_t, UINTMAX_C);
240#if INT8_C(12) != 12
241#error "INT8_C not usable in #if"
242#endif
243#if INT16_C(12) != 12
244#error "INT16_C not usable in #if"
245#endif
246#if INT32_C(12) != 12
247#error "INT32_C not usable in #if"
248#endif
249#if INT64_C(12) != 12
250#error "INT64_C not usable in #if"
251#endif
252#if INTMAX_C(12) != 12
253#error "INTMAX_C not usable in #if"
254#endif
255#if UINT8_C(12) != 12
256#error "UINT8_C not usable in #if"
257#endif
258#if UINT16_C(12) != 12
259#error "UINT16_C not usable in #if"
260#endif
261#if UINT32_C(12) != 12
262#error "UINT32_C not usable in #if"
263#endif
264#if UINT64_C(12) != 12
265#error "UINT64_C not usable in #if"
266#endif
267#if UINTMAX_C(12) != 12
268#error "UINTMAX_C not usable in #if"
269#endif
270}
271