1193326Sed/*===---- stdint.h - Standard header for sized integer types --------------===*\
2193326Sed *
3193326Sed * Copyright (c) 2009 Chris Lattner
4193326Sed *
5193326Sed * Permission is hereby granted, free of charge, to any person obtaining a copy
6193326Sed * of this software and associated documentation files (the "Software"), to deal
7193326Sed * in the Software without restriction, including without limitation the rights
8193326Sed * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9193326Sed * copies of the Software, and to permit persons to whom the Software is
10193326Sed * furnished to do so, subject to the following conditions:
11193326Sed *
12193326Sed * The above copyright notice and this permission notice shall be included in
13193326Sed * all copies or substantial portions of the Software.
14193326Sed *
15193326Sed * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16193326Sed * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17193326Sed * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18193326Sed * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19193326Sed * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20193326Sed * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21193326Sed * THE SOFTWARE.
22193326Sed *
23193326Sed\*===----------------------------------------------------------------------===*/
24193326Sed
25193326Sed#ifndef __CLANG_STDINT_H
26193326Sed#define __CLANG_STDINT_H
27193326Sed
28193326Sed/* If we're hosted, fall back to the system's stdint.h, which might have
29193326Sed * additional definitions.
30193326Sed */
31198893Srdivacky#if __STDC_HOSTED__ && \
32198893Srdivacky    defined(__has_include_next) && __has_include_next(<stdint.h>)
33252723Sdim
34252723Sdim// C99 7.18.3 Limits of other integer types
35252723Sdim//
36252723Sdim//  Footnote 219, 220: C++ implementations should define these macros only when
37252723Sdim//  __STDC_LIMIT_MACROS is defined before <stdint.h> is included.
38252723Sdim//
39252723Sdim//  Footnote 222: C++ implementations should define these macros only when
40252723Sdim//  __STDC_CONSTANT_MACROS is defined before <stdint.h> is included.
41252723Sdim//
42252723Sdim// C++11 [cstdint.syn]p2:
43252723Sdim//
44252723Sdim//  The macros defined by <cstdint> are provided unconditionally. In particular,
45252723Sdim//  the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS (mentioned in
46252723Sdim//  footnotes 219, 220, and 222 in the C standard) play no role in C++.
47252723Sdim//
48252723Sdim// C11 removed the problematic footnotes.
49252723Sdim//
50252723Sdim// Work around this inconsistency by always defining those macros in C++ mode,
51252723Sdim// so that a C library implementation which follows the C99 standard can be
52252723Sdim// used in C++.
53252723Sdim# ifdef __cplusplus
54252723Sdim#  if !defined(__STDC_LIMIT_MACROS)
55252723Sdim#   define __STDC_LIMIT_MACROS
56252723Sdim#   define __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
57252723Sdim#  endif
58252723Sdim#  if !defined(__STDC_CONSTANT_MACROS)
59252723Sdim#   define __STDC_CONSTANT_MACROS
60252723Sdim#   define __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
61252723Sdim#  endif
62252723Sdim# endif
63252723Sdim
64193326Sed# include_next <stdint.h>
65252723Sdim
66252723Sdim# ifdef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
67252723Sdim#  undef __STDC_LIMIT_MACROS
68252723Sdim#  undef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
69252723Sdim# endif
70252723Sdim# ifdef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
71252723Sdim#  undef __STDC_CONSTANT_MACROS
72252723Sdim#  undef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
73252723Sdim# endif
74252723Sdim
75193326Sed#else
76193326Sed
77193326Sed/* C99 7.18.1.1 Exact-width integer types.
78193326Sed * C99 7.18.1.2 Minimum-width integer types.
79193326Sed * C99 7.18.1.3 Fastest minimum-width integer types.
80199482Srdivacky *
81199482Srdivacky * The standard requires that exact-width type be defined for 8-, 16-, 32-, and
82199482Srdivacky * 64-bit types if they are implemented. Other exact width types are optional.
83199482Srdivacky * This implementation defines an exact-width types for every integer width
84199482Srdivacky * that is represented in the standard integer types.
85199482Srdivacky *
86199482Srdivacky * The standard also requires minimum-width types be defined for 8-, 16-, 32-,
87199482Srdivacky * and 64-bit widths regardless of whether there are corresponding exact-width
88199482Srdivacky * types.
89199482Srdivacky *
90221345Sdim * To accommodate targets that are missing types that are exactly 8, 16, 32, or
91199482Srdivacky * 64 bits wide, this implementation takes an approach of cascading
92199482Srdivacky * redefintions, redefining __int_leastN_t to successively smaller exact-width
93199482Srdivacky * types. It is therefore important that the types are defined in order of
94199482Srdivacky * descending widths.
95199482Srdivacky *
96199482Srdivacky * We currently assume that the minimum-width types and the fastest
97199482Srdivacky * minimum-width types are the same. This is allowed by the standard, but is
98199482Srdivacky * suboptimal.
99199482Srdivacky *
100199482Srdivacky * In violation of the standard, some targets do not implement a type that is
101199482Srdivacky * wide enough to represent all of the required widths (8-, 16-, 32-, 64-bit).
102221345Sdim * To accommodate these targets, a required minimum-width type is only
103199482Srdivacky * defined if there exists an exact-width type of equal or greater width.
104193326Sed */
105193326Sed
106198954Srdivacky#ifdef __INT64_TYPE__
107199482Srdivacky# ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
108199482Srdivackytypedef signed __INT64_TYPE__ int64_t;
109199482Srdivacky# endif /* __int8_t_defined */
110198954Srdivackytypedef unsigned __INT64_TYPE__ uint64_t;
111199482Srdivacky# define __int_least64_t int64_t
112199482Srdivacky# define __uint_least64_t uint64_t
113199482Srdivacky# define __int_least32_t int64_t
114199482Srdivacky# define __uint_least32_t uint64_t
115199482Srdivacky# define __int_least16_t int64_t
116199482Srdivacky# define __uint_least16_t uint64_t
117199482Srdivacky# define __int_least8_t int64_t
118199482Srdivacky# define __uint_least8_t uint64_t
119199482Srdivacky#endif /* __INT64_TYPE__ */
120193326Sed
121199482Srdivacky#ifdef __int_least64_t
122199482Srdivackytypedef __int_least64_t int_least64_t;
123199482Srdivackytypedef __uint_least64_t uint_least64_t;
124199482Srdivackytypedef __int_least64_t int_fast64_t;
125199482Srdivackytypedef __uint_least64_t uint_fast64_t;
126199482Srdivacky#endif /* __int_least64_t */
127199482Srdivacky
128199482Srdivacky#ifdef __INT56_TYPE__
129199482Srdivackytypedef signed __INT56_TYPE__ int56_t;
130199482Srdivackytypedef unsigned __INT56_TYPE__ uint56_t;
131199482Srdivackytypedef int56_t int_least56_t;
132199482Srdivackytypedef uint56_t uint_least56_t;
133199482Srdivackytypedef int56_t int_fast56_t;
134199482Srdivackytypedef uint56_t uint_fast56_t;
135199482Srdivacky# define __int_least32_t int56_t
136199482Srdivacky# define __uint_least32_t uint56_t
137199482Srdivacky# define __int_least16_t int56_t
138199482Srdivacky# define __uint_least16_t uint56_t
139199482Srdivacky# define __int_least8_t int56_t
140199482Srdivacky# define __uint_least8_t uint56_t
141199482Srdivacky#endif /* __INT56_TYPE__ */
142199482Srdivacky
143199482Srdivacky
144199482Srdivacky#ifdef __INT48_TYPE__
145199482Srdivackytypedef signed __INT48_TYPE__ int48_t;
146199482Srdivackytypedef unsigned __INT48_TYPE__ uint48_t;
147199482Srdivackytypedef int48_t int_least48_t;
148199482Srdivackytypedef uint48_t uint_least48_t;
149199482Srdivackytypedef int48_t int_fast48_t;
150199482Srdivackytypedef uint48_t uint_fast48_t;
151199482Srdivacky# define __int_least32_t int48_t
152199482Srdivacky# define __uint_least32_t uint48_t
153199482Srdivacky# define __int_least16_t int48_t
154199482Srdivacky# define __uint_least16_t uint48_t
155199482Srdivacky# define __int_least8_t int48_t
156199482Srdivacky# define __uint_least8_t uint48_t
157199482Srdivacky#endif /* __INT48_TYPE__ */
158199482Srdivacky
159199482Srdivacky
160199482Srdivacky#ifdef __INT40_TYPE__
161199482Srdivackytypedef signed __INT40_TYPE__ int40_t;
162199482Srdivackytypedef unsigned __INT40_TYPE__ uint40_t;
163199482Srdivackytypedef int40_t int_least40_t;
164199482Srdivackytypedef uint40_t uint_least40_t;
165199482Srdivackytypedef int40_t int_fast40_t;
166199482Srdivackytypedef uint40_t uint_fast40_t;
167199482Srdivacky# define __int_least32_t int40_t
168199482Srdivacky# define __uint_least32_t uint40_t
169199482Srdivacky# define __int_least16_t int40_t
170199482Srdivacky# define __uint_least16_t uint40_t
171199482Srdivacky# define __int_least8_t int40_t
172199482Srdivacky# define __uint_least8_t uint40_t
173199482Srdivacky#endif /* __INT40_TYPE__ */
174199482Srdivacky
175199482Srdivacky
176199482Srdivacky#ifdef __INT32_TYPE__
177199482Srdivacky
178199482Srdivacky# ifndef __int8_t_defined /* glibc sys/types.h also defines int32_t*/
179199482Srdivackytypedef signed __INT32_TYPE__ int32_t;
180199482Srdivacky# endif /* __int8_t_defined */
181199482Srdivacky
182199482Srdivacky# ifndef __uint32_t_defined  /* more glibc compatibility */
183199482Srdivacky# define __uint32_t_defined
184193326Sedtypedef unsigned __INT32_TYPE__ uint32_t;
185199482Srdivacky# endif /* __uint32_t_defined */
186193326Sed
187199482Srdivacky# define __int_least32_t int32_t
188199482Srdivacky# define __uint_least32_t uint32_t
189199482Srdivacky# define __int_least16_t int32_t
190199482Srdivacky# define __uint_least16_t uint32_t
191199482Srdivacky# define __int_least8_t int32_t
192199482Srdivacky# define __uint_least8_t uint32_t
193199482Srdivacky#endif /* __INT32_TYPE__ */
194198954Srdivacky
195199482Srdivacky#ifdef __int_least32_t
196199482Srdivackytypedef __int_least32_t int_least32_t;
197199482Srdivackytypedef __uint_least32_t uint_least32_t;
198199482Srdivackytypedef __int_least32_t int_fast32_t;
199199482Srdivackytypedef __uint_least32_t uint_fast32_t;
200199482Srdivacky#endif /* __int_least32_t */
201199482Srdivacky
202199482Srdivacky#ifdef __INT24_TYPE__
203199482Srdivackytypedef signed __INT24_TYPE__ int24_t;
204199482Srdivackytypedef unsigned __INT24_TYPE__ uint24_t;
205199482Srdivackytypedef int24_t int_least24_t;
206199482Srdivackytypedef uint24_t uint_least24_t;
207199482Srdivackytypedef int24_t int_fast24_t;
208199482Srdivackytypedef uint24_t uint_fast24_t;
209199482Srdivacky# define __int_least16_t int24_t
210199482Srdivacky# define __uint_least16_t uint24_t
211199482Srdivacky# define __int_least8_t int24_t
212199482Srdivacky# define __uint_least8_t uint24_t
213199482Srdivacky#endif /* __INT24_TYPE__ */
214199482Srdivacky
215199482Srdivacky#ifdef __INT16_TYPE__
216199482Srdivacky#ifndef __int8_t_defined /* glibc sys/types.h also defines int16_t*/
217199482Srdivackytypedef signed __INT16_TYPE__ int16_t;
218199482Srdivacky#endif /* __int8_t_defined */
219198954Srdivackytypedef unsigned __INT16_TYPE__ uint16_t;
220199482Srdivacky# define __int_least16_t int16_t
221199482Srdivacky# define __uint_least16_t uint16_t
222199482Srdivacky# define __int_least8_t int16_t
223199482Srdivacky# define __uint_least8_t uint16_t
224199482Srdivacky#endif /* __INT16_TYPE__ */
225193326Sed
226199482Srdivacky#ifdef __int_least16_t
227199482Srdivackytypedef __int_least16_t int_least16_t;
228199482Srdivackytypedef __uint_least16_t uint_least16_t;
229199482Srdivackytypedef __int_least16_t int_fast16_t;
230199482Srdivackytypedef __uint_least16_t uint_fast16_t;
231199482Srdivacky#endif /* __int_least16_t */
232193326Sed
233199482Srdivacky
234199482Srdivacky#ifdef __INT8_TYPE__
235199482Srdivacky#ifndef __int8_t_defined  /* glibc sys/types.h also defines int8_t*/
236198954Srdivackytypedef signed __INT8_TYPE__ int8_t;
237199482Srdivacky#endif /* __int8_t_defined */
238198954Srdivackytypedef unsigned __INT8_TYPE__ uint8_t;
239199482Srdivacky# define __int_least8_t int8_t
240199482Srdivacky# define __uint_least8_t uint8_t
241199482Srdivacky#endif /* __INT8_TYPE__ */
242198954Srdivacky
243199482Srdivacky#ifdef __int_least8_t
244199482Srdivackytypedef __int_least8_t int_least8_t;
245199482Srdivackytypedef __uint_least8_t uint_least8_t;
246199482Srdivackytypedef __int_least8_t int_fast8_t;
247199482Srdivackytypedef __uint_least8_t uint_fast8_t;
248199482Srdivacky#endif /* __int_least8_t */
249199482Srdivacky
250198954Srdivacky/* prevent glibc sys/types.h from defining conflicting types */
251198954Srdivacky#ifndef __int8_t_defined
252198954Srdivacky# define __int8_t_defined
253198954Srdivacky#endif /* __int8_t_defined */
254198954Srdivacky
255193326Sed/* C99 7.18.1.4 Integer types capable of holding object pointers.
256193326Sed */
257199512Srdivacky#define __stdint_join3(a,b,c) a ## b ## c
258199512Srdivacky
259199990Srdivacky#define  __intn_t(n) __stdint_join3( int, n, _t)
260199990Srdivacky#define __uintn_t(n) __stdint_join3(uint, n, _t)
261199990Srdivacky
262207619Srdivacky#ifndef _INTPTR_T
263193326Sed#ifndef __intptr_t_defined
264199990Srdivackytypedef  __intn_t(__INTPTR_WIDTH__)  intptr_t;
265193326Sed#define __intptr_t_defined
266207619Srdivacky#define _INTPTR_T
267193326Sed#endif
268207619Srdivacky#endif
269207619Srdivacky
270207619Srdivacky#ifndef _UINTPTR_T
271199990Srdivackytypedef __uintn_t(__INTPTR_WIDTH__) uintptr_t;
272207619Srdivacky#define _UINTPTR_T
273207619Srdivacky#endif
274193326Sed
275193326Sed/* C99 7.18.1.5 Greatest-width integer types.
276193326Sed */
277210299Sedtypedef __INTMAX_TYPE__  intmax_t;
278210299Sedtypedef __UINTMAX_TYPE__ uintmax_t;
279193326Sed
280198954Srdivacky/* C99 7.18.4 Macros for minimum-width integer constants.
281198954Srdivacky *
282199482Srdivacky * The standard requires that integer constant macros be defined for all the
283199482Srdivacky * minimum-width types defined above. As 8-, 16-, 32-, and 64-bit minimum-width
284199482Srdivacky * types are required, the corresponding integer constant macros are defined
285199482Srdivacky * here. This implementation also defines minimum-width types for every other
286199482Srdivacky * integer width that the target implements, so corresponding macros are
287199482Srdivacky * defined below, too.
288199482Srdivacky *
289199482Srdivacky * These macros are defined using the same successive-shrinking approach as
290199482Srdivacky * the type definitions above. It is likewise important that macros are defined
291199482Srdivacky * in order of decending width.
292199482Srdivacky *
293198954Srdivacky * Note that C++ should not check __STDC_CONSTANT_MACROS here, contrary to the
294198954Srdivacky * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]).
295198954Srdivacky */
296198954Srdivacky
297199482Srdivacky#define __int_c_join(a, b) a ## b
298199482Srdivacky#define __int_c(v, suffix) __int_c_join(v, suffix)
299199482Srdivacky#define __uint_c(v, suffix) __int_c_join(v##U, suffix)
300199482Srdivacky
301199482Srdivacky
302198954Srdivacky#ifdef __INT64_TYPE__
303199482Srdivacky# ifdef __INT64_C_SUFFIX__
304199482Srdivacky#  define __int64_c_suffix __INT64_C_SUFFIX__
305199482Srdivacky#  define __int32_c_suffix __INT64_C_SUFFIX__
306199482Srdivacky#  define __int16_c_suffix __INT64_C_SUFFIX__
307199482Srdivacky#  define  __int8_c_suffix __INT64_C_SUFFIX__
308199482Srdivacky# else
309199482Srdivacky#  undef __int64_c_suffix
310199482Srdivacky#  undef __int32_c_suffix
311199482Srdivacky#  undef __int16_c_suffix
312199482Srdivacky#  undef  __int8_c_suffix
313199482Srdivacky# endif /* __INT64_C_SUFFIX__ */
314199482Srdivacky#endif /* __INT64_TYPE__ */
315198954Srdivacky
316199482Srdivacky#ifdef __int_least64_t
317199482Srdivacky# ifdef __int64_c_suffix
318199482Srdivacky#  define INT64_C(v) __int_c(v, __int64_c_suffix)
319199482Srdivacky#  define UINT64_C(v) __uint_c(v, __int64_c_suffix)
320199482Srdivacky# else
321199482Srdivacky#  define INT64_C(v) v
322199482Srdivacky#  define UINT64_C(v) v ## U
323199482Srdivacky# endif /* __int64_c_suffix */
324199482Srdivacky#endif /* __int_least64_t */
325198954Srdivacky
326199482Srdivacky
327199482Srdivacky#ifdef __INT56_TYPE__
328199482Srdivacky# ifdef __INT56_C_SUFFIX__
329199482Srdivacky#  define INT56_C(v) __int_c(v, __INT56_C_SUFFIX__)
330199482Srdivacky#  define UINT56_C(v) __uint_c(v, __INT56_C_SUFFIX__)
331199482Srdivacky#  define __int32_c_suffix __INT56_C_SUFFIX__
332199482Srdivacky#  define __int16_c_suffix __INT56_C_SUFFIX__
333199482Srdivacky#  define __int8_c_suffix  __INT56_C_SUFFIX__
334199482Srdivacky# else
335199482Srdivacky#  define INT56_C(v) v
336199482Srdivacky#  define UINT56_C(v) v ## U
337199482Srdivacky#  undef __int32_c_suffix
338199482Srdivacky#  undef __int16_c_suffix
339199482Srdivacky#  undef  __int8_c_suffix
340199482Srdivacky# endif /* __INT56_C_SUFFIX__ */
341199482Srdivacky#endif /* __INT56_TYPE__ */
342199482Srdivacky
343199482Srdivacky
344199482Srdivacky#ifdef __INT48_TYPE__
345199482Srdivacky# ifdef __INT48_C_SUFFIX__
346199482Srdivacky#  define INT48_C(v) __int_c(v, __INT48_C_SUFFIX__)
347199482Srdivacky#  define UINT48_C(v) __uint_c(v, __INT48_C_SUFFIX__)
348199482Srdivacky#  define __int32_c_suffix __INT48_C_SUFFIX__
349199482Srdivacky#  define __int16_c_suffix __INT48_C_SUFFIX__
350199482Srdivacky#  define __int8_c_suffix  __INT48_C_SUFFIX__
351199482Srdivacky# else
352199482Srdivacky#  define INT48_C(v) v
353199482Srdivacky#  define UINT48_C(v) v ## U
354199482Srdivacky#  undef __int32_c_suffix
355199482Srdivacky#  undef __int16_c_suffix
356199482Srdivacky#  undef  __int8_c_suffix
357199482Srdivacky# endif /* __INT48_C_SUFFIX__ */
358199482Srdivacky#endif /* __INT48_TYPE__ */
359199482Srdivacky
360199482Srdivacky
361199482Srdivacky#ifdef __INT40_TYPE__
362199482Srdivacky# ifdef __INT40_C_SUFFIX__
363199482Srdivacky#  define INT40_C(v) __int_c(v, __INT40_C_SUFFIX__)
364199482Srdivacky#  define UINT40_C(v) __uint_c(v, __INT40_C_SUFFIX__)
365199482Srdivacky#  define __int32_c_suffix __INT40_C_SUFFIX__
366199482Srdivacky#  define __int16_c_suffix __INT40_C_SUFFIX__
367199482Srdivacky#  define __int8_c_suffix  __INT40_C_SUFFIX__
368199482Srdivacky# else
369199482Srdivacky#  define INT40_C(v) v
370199482Srdivacky#  define UINT40_C(v) v ## U
371199482Srdivacky#  undef __int32_c_suffix
372199482Srdivacky#  undef __int16_c_suffix
373199482Srdivacky#  undef  __int8_c_suffix
374199482Srdivacky# endif /* __INT40_C_SUFFIX__ */
375199482Srdivacky#endif /* __INT40_TYPE__ */
376199482Srdivacky
377199482Srdivacky
378199482Srdivacky#ifdef __INT32_TYPE__
379199482Srdivacky# ifdef __INT32_C_SUFFIX__
380199482Srdivacky#  define __int32_c_suffix __INT32_C_SUFFIX__
381199482Srdivacky#  define __int16_c_suffix __INT32_C_SUFFIX__
382199482Srdivacky#  define __int8_c_suffix  __INT32_C_SUFFIX__
383199482Srdivacky#else
384199482Srdivacky#  undef __int32_c_suffix
385199482Srdivacky#  undef __int16_c_suffix
386199482Srdivacky#  undef  __int8_c_suffix
387199482Srdivacky# endif /* __INT32_C_SUFFIX__ */
388199482Srdivacky#endif /* __INT32_TYPE__ */
389199482Srdivacky
390199482Srdivacky#ifdef __int_least32_t
391199482Srdivacky# ifdef __int32_c_suffix
392199482Srdivacky#  define INT32_C(v) __int_c(v, __int32_c_suffix)
393199482Srdivacky#  define UINT32_C(v) __uint_c(v, __int32_c_suffix)
394199482Srdivacky# else
395199482Srdivacky#  define INT32_C(v) v
396199482Srdivacky#  define UINT32_C(v) v ## U
397199482Srdivacky# endif /* __int32_c_suffix */
398199482Srdivacky#endif /* __int_least32_t */
399199482Srdivacky
400199482Srdivacky
401199482Srdivacky#ifdef __INT24_TYPE__
402199482Srdivacky# ifdef __INT24_C_SUFFIX__
403199482Srdivacky#  define INT24_C(v) __int_c(v, __INT24_C_SUFFIX__)
404199482Srdivacky#  define UINT24_C(v) __uint_c(v, __INT24_C_SUFFIX__)
405199482Srdivacky#  define __int16_c_suffix __INT24_C_SUFFIX__
406199482Srdivacky#  define __int8_c_suffix  __INT24_C_SUFFIX__
407199482Srdivacky# else
408199482Srdivacky#  define INT24_C(v) v
409199482Srdivacky#  define UINT24_C(v) v ## U
410199482Srdivacky#  undef __int16_c_suffix
411199482Srdivacky#  undef  __int8_c_suffix
412199482Srdivacky# endif /* __INT24_C_SUFFIX__ */
413199482Srdivacky#endif /* __INT24_TYPE__ */
414199482Srdivacky
415199482Srdivacky
416199482Srdivacky#ifdef __INT16_TYPE__
417199482Srdivacky# ifdef __INT16_C_SUFFIX__
418199482Srdivacky#  define __int16_c_suffix __INT16_C_SUFFIX__
419199482Srdivacky#  define __int8_c_suffix  __INT16_C_SUFFIX__
420199482Srdivacky#else
421199482Srdivacky#  undef __int16_c_suffix
422199482Srdivacky#  undef  __int8_c_suffix
423199482Srdivacky# endif /* __INT16_C_SUFFIX__ */
424199482Srdivacky#endif /* __INT16_TYPE__ */
425199482Srdivacky
426199482Srdivacky#ifdef __int_least16_t
427199482Srdivacky# ifdef __int16_c_suffix
428199482Srdivacky#  define INT16_C(v) __int_c(v, __int16_c_suffix)
429199482Srdivacky#  define UINT16_C(v) __uint_c(v, __int16_c_suffix)
430199482Srdivacky# else
431199482Srdivacky#  define INT16_C(v) v
432199482Srdivacky#  define UINT16_C(v) v ## U
433199482Srdivacky# endif /* __int16_c_suffix */
434199482Srdivacky#endif /* __int_least16_t */
435199482Srdivacky
436199482Srdivacky
437199482Srdivacky#ifdef __INT8_TYPE__
438199482Srdivacky# ifdef __INT8_C_SUFFIX__
439199482Srdivacky#  define __int8_c_suffix __INT8_C_SUFFIX__
440199482Srdivacky#else
441199482Srdivacky#  undef  __int8_c_suffix
442199482Srdivacky# endif /* __INT8_C_SUFFIX__ */
443199482Srdivacky#endif /* __INT8_TYPE__ */
444199482Srdivacky
445199482Srdivacky#ifdef __int_least8_t
446199482Srdivacky# ifdef __int8_c_suffix
447199482Srdivacky#  define INT8_C(v) __int_c(v, __int8_c_suffix)
448199482Srdivacky#  define UINT8_C(v) __uint_c(v, __int8_c_suffix)
449199482Srdivacky# else
450199482Srdivacky#  define INT8_C(v) v
451199482Srdivacky#  define UINT8_C(v) v ## U
452199482Srdivacky# endif /* __int8_c_suffix */
453199482Srdivacky#endif /* __int_least8_t */
454199482Srdivacky
455199482Srdivacky
456193326Sed/* C99 7.18.2.1 Limits of exact-width integer types.
457193326Sed * C99 7.18.2.2 Limits of minimum-width integer types.
458193326Sed * C99 7.18.2.3 Limits of fastest minimum-width integer types.
459193326Sed *
460199482Srdivacky * The presence of limit macros are completely optional in C99.  This
461199482Srdivacky * implementation defines limits for all of the types (exact- and
462199482Srdivacky * minimum-width) that it defines above, using the limits of the minimum-width
463199482Srdivacky * type for any types that do not have exact-width representations.
464199482Srdivacky *
465199482Srdivacky * As in the type definitions, this section takes an approach of
466199482Srdivacky * successive-shrinking to determine which limits to use for the standard (8,
467199482Srdivacky * 16, 32, 64) bit widths when they don't have exact representations. It is
468199482Srdivacky * therefore important that the defintions be kept in order of decending
469199482Srdivacky * widths.
470199482Srdivacky *
471193326Sed * Note that C++ should not check __STDC_LIMIT_MACROS here, contrary to the
472193326Sed * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]).
473193326Sed */
474193326Sed
475193326Sed#ifdef __INT64_TYPE__
476199482Srdivacky# define INT64_MAX           INT64_C( 9223372036854775807)
477199482Srdivacky# define INT64_MIN         (-INT64_C( 9223372036854775807)-1)
478199482Srdivacky# define UINT64_MAX         UINT64_C(18446744073709551615)
479199482Srdivacky# define __INT_LEAST64_MIN   INT64_MIN
480199482Srdivacky# define __INT_LEAST64_MAX   INT64_MAX
481199482Srdivacky# define __UINT_LEAST64_MAX UINT64_MAX
482199482Srdivacky# define __INT_LEAST32_MIN   INT64_MIN
483199482Srdivacky# define __INT_LEAST32_MAX   INT64_MAX
484199482Srdivacky# define __UINT_LEAST32_MAX UINT64_MAX
485199482Srdivacky# define __INT_LEAST16_MIN   INT64_MIN
486199482Srdivacky# define __INT_LEAST16_MAX   INT64_MAX
487199482Srdivacky# define __UINT_LEAST16_MAX UINT64_MAX
488199482Srdivacky# define __INT_LEAST8_MIN    INT64_MIN
489199482Srdivacky# define __INT_LEAST8_MAX    INT64_MAX
490199482Srdivacky# define __UINT_LEAST8_MAX  UINT64_MAX
491199482Srdivacky#endif /* __INT64_TYPE__ */
492193326Sed
493199482Srdivacky#ifdef __INT_LEAST64_MIN
494199482Srdivacky# define INT_LEAST64_MIN   __INT_LEAST64_MIN
495199482Srdivacky# define INT_LEAST64_MAX   __INT_LEAST64_MAX
496199482Srdivacky# define UINT_LEAST64_MAX __UINT_LEAST64_MAX
497199482Srdivacky# define INT_FAST64_MIN    __INT_LEAST64_MIN
498199482Srdivacky# define INT_FAST64_MAX    __INT_LEAST64_MAX
499199482Srdivacky# define UINT_FAST64_MAX  __UINT_LEAST64_MAX
500199482Srdivacky#endif /* __INT_LEAST64_MIN */
501198954Srdivacky
502198954Srdivacky
503199482Srdivacky#ifdef __INT56_TYPE__
504199482Srdivacky# define INT56_MAX           INT56_C(36028797018963967)
505199482Srdivacky# define INT56_MIN         (-INT56_C(36028797018963967)-1)
506199482Srdivacky# define UINT56_MAX         UINT56_C(72057594037927935)
507199482Srdivacky# define INT_LEAST56_MIN     INT56_MIN
508199482Srdivacky# define INT_LEAST56_MAX     INT56_MAX
509199482Srdivacky# define UINT_LEAST56_MAX   UINT56_MAX
510199482Srdivacky# define INT_FAST56_MIN      INT56_MIN
511199482Srdivacky# define INT_FAST56_MAX      INT56_MAX
512199482Srdivacky# define UINT_FAST56_MAX    UINT56_MAX
513199482Srdivacky# define __INT_LEAST32_MIN   INT56_MIN
514199482Srdivacky# define __INT_LEAST32_MAX   INT56_MAX
515199482Srdivacky# define __UINT_LEAST32_MAX UINT56_MAX
516199482Srdivacky# define __INT_LEAST16_MIN   INT56_MIN
517199482Srdivacky# define __INT_LEAST16_MAX   INT56_MAX
518199482Srdivacky# define __UINT_LEAST16_MAX UINT56_MAX
519199482Srdivacky# define __INT_LEAST8_MIN    INT56_MIN
520199482Srdivacky# define __INT_LEAST8_MAX    INT56_MAX
521199482Srdivacky# define __UINT_LEAST8_MAX  UINT56_MAX
522199482Srdivacky#endif /* __INT56_TYPE__ */
523198954Srdivacky
524199482Srdivacky
525199482Srdivacky#ifdef __INT48_TYPE__
526199482Srdivacky# define INT48_MAX           INT48_C(140737488355327)
527199482Srdivacky# define INT48_MIN         (-INT48_C(140737488355327)-1)
528199482Srdivacky# define UINT48_MAX         UINT48_C(281474976710655)
529199482Srdivacky# define INT_LEAST48_MIN     INT48_MIN
530199482Srdivacky# define INT_LEAST48_MAX     INT48_MAX
531199482Srdivacky# define UINT_LEAST48_MAX   UINT48_MAX
532199482Srdivacky# define INT_FAST48_MIN      INT48_MIN
533199482Srdivacky# define INT_FAST48_MAX      INT48_MAX
534199482Srdivacky# define UINT_FAST48_MAX    UINT48_MAX
535199482Srdivacky# define __INT_LEAST32_MIN   INT48_MIN
536199482Srdivacky# define __INT_LEAST32_MAX   INT48_MAX
537199482Srdivacky# define __UINT_LEAST32_MAX UINT48_MAX
538199482Srdivacky# define __INT_LEAST16_MIN   INT48_MIN
539199482Srdivacky# define __INT_LEAST16_MAX   INT48_MAX
540199482Srdivacky# define __UINT_LEAST16_MAX UINT48_MAX
541199482Srdivacky# define __INT_LEAST8_MIN    INT48_MIN
542199482Srdivacky# define __INT_LEAST8_MAX    INT48_MAX
543199482Srdivacky# define __UINT_LEAST8_MAX  UINT48_MAX
544199482Srdivacky#endif /* __INT48_TYPE__ */
545199482Srdivacky
546199482Srdivacky
547199482Srdivacky#ifdef __INT40_TYPE__
548199482Srdivacky# define INT40_MAX           INT40_C(549755813887)
549199482Srdivacky# define INT40_MIN         (-INT40_C(549755813887)-1)
550199482Srdivacky# define UINT40_MAX         UINT40_C(1099511627775)
551199482Srdivacky# define INT_LEAST40_MIN     INT40_MIN
552199482Srdivacky# define INT_LEAST40_MAX     INT40_MAX
553199482Srdivacky# define UINT_LEAST40_MAX   UINT40_MAX
554199482Srdivacky# define INT_FAST40_MIN      INT40_MIN
555199482Srdivacky# define INT_FAST40_MAX      INT40_MAX
556199482Srdivacky# define UINT_FAST40_MAX    UINT40_MAX
557199482Srdivacky# define __INT_LEAST32_MIN   INT40_MIN
558199482Srdivacky# define __INT_LEAST32_MAX   INT40_MAX
559199482Srdivacky# define __UINT_LEAST32_MAX UINT40_MAX
560199482Srdivacky# define __INT_LEAST16_MIN   INT40_MIN
561199482Srdivacky# define __INT_LEAST16_MAX   INT40_MAX
562199482Srdivacky# define __UINT_LEAST16_MAX UINT40_MAX
563199482Srdivacky# define __INT_LEAST8_MIN    INT40_MIN
564199482Srdivacky# define __INT_LEAST8_MAX    INT40_MAX
565199482Srdivacky# define __UINT_LEAST8_MAX  UINT40_MAX
566199482Srdivacky#endif /* __INT40_TYPE__ */
567199482Srdivacky
568199482Srdivacky
569199482Srdivacky#ifdef __INT32_TYPE__
570199482Srdivacky# define INT32_MAX           INT32_C(2147483647)
571199482Srdivacky# define INT32_MIN         (-INT32_C(2147483647)-1)
572199482Srdivacky# define UINT32_MAX         UINT32_C(4294967295)
573199482Srdivacky# define __INT_LEAST32_MIN   INT32_MIN
574199482Srdivacky# define __INT_LEAST32_MAX   INT32_MAX
575199482Srdivacky# define __UINT_LEAST32_MAX UINT32_MAX
576199482Srdivacky# define __INT_LEAST16_MIN   INT32_MIN
577199482Srdivacky# define __INT_LEAST16_MAX   INT32_MAX
578199482Srdivacky# define __UINT_LEAST16_MAX UINT32_MAX
579199482Srdivacky# define __INT_LEAST8_MIN    INT32_MIN
580199482Srdivacky# define __INT_LEAST8_MAX    INT32_MAX
581199482Srdivacky# define __UINT_LEAST8_MAX  UINT32_MAX
582199482Srdivacky#endif /* __INT32_TYPE__ */
583199482Srdivacky
584199482Srdivacky#ifdef __INT_LEAST32_MIN
585199482Srdivacky# define INT_LEAST32_MIN   __INT_LEAST32_MIN
586199482Srdivacky# define INT_LEAST32_MAX   __INT_LEAST32_MAX
587199482Srdivacky# define UINT_LEAST32_MAX __UINT_LEAST32_MAX
588199482Srdivacky# define INT_FAST32_MIN    __INT_LEAST32_MIN
589199482Srdivacky# define INT_FAST32_MAX    __INT_LEAST32_MAX
590199482Srdivacky# define UINT_FAST32_MAX  __UINT_LEAST32_MAX
591199482Srdivacky#endif /* __INT_LEAST32_MIN */
592199482Srdivacky
593199482Srdivacky
594199482Srdivacky#ifdef __INT24_TYPE__
595199482Srdivacky# define INT24_MAX           INT24_C(8388607)
596199482Srdivacky# define INT24_MIN         (-INT24_C(8388607)-1)
597199482Srdivacky# define UINT24_MAX         UINT24_C(16777215)
598199482Srdivacky# define INT_LEAST24_MIN     INT24_MIN
599199482Srdivacky# define INT_LEAST24_MAX     INT24_MAX
600199482Srdivacky# define UINT_LEAST24_MAX   UINT24_MAX
601199482Srdivacky# define INT_FAST24_MIN      INT24_MIN
602199482Srdivacky# define INT_FAST24_MAX      INT24_MAX
603199482Srdivacky# define UINT_FAST24_MAX    UINT24_MAX
604199482Srdivacky# define __INT_LEAST16_MIN   INT24_MIN
605199482Srdivacky# define __INT_LEAST16_MAX   INT24_MAX
606199482Srdivacky# define __UINT_LEAST16_MAX UINT24_MAX
607199482Srdivacky# define __INT_LEAST8_MIN    INT24_MIN
608199482Srdivacky# define __INT_LEAST8_MAX    INT24_MAX
609199482Srdivacky# define __UINT_LEAST8_MAX  UINT24_MAX
610199482Srdivacky#endif /* __INT24_TYPE__ */
611199482Srdivacky
612199482Srdivacky
613199482Srdivacky#ifdef __INT16_TYPE__
614199482Srdivacky#define INT16_MAX            INT16_C(32767)
615199482Srdivacky#define INT16_MIN          (-INT16_C(32767)-1)
616199482Srdivacky#define UINT16_MAX          UINT16_C(65535)
617199482Srdivacky# define __INT_LEAST16_MIN   INT16_MIN
618199482Srdivacky# define __INT_LEAST16_MAX   INT16_MAX
619199482Srdivacky# define __UINT_LEAST16_MAX UINT16_MAX
620199482Srdivacky# define __INT_LEAST8_MIN    INT16_MIN
621199482Srdivacky# define __INT_LEAST8_MAX    INT16_MAX
622199482Srdivacky# define __UINT_LEAST8_MAX  UINT16_MAX
623199482Srdivacky#endif /* __INT16_TYPE__ */
624199482Srdivacky
625199482Srdivacky#ifdef __INT_LEAST16_MIN
626199482Srdivacky# define INT_LEAST16_MIN   __INT_LEAST16_MIN
627199482Srdivacky# define INT_LEAST16_MAX   __INT_LEAST16_MAX
628199482Srdivacky# define UINT_LEAST16_MAX __UINT_LEAST16_MAX
629199482Srdivacky# define INT_FAST16_MIN    __INT_LEAST16_MIN
630199482Srdivacky# define INT_FAST16_MAX    __INT_LEAST16_MAX
631199482Srdivacky# define UINT_FAST16_MAX  __UINT_LEAST16_MAX
632199482Srdivacky#endif /* __INT_LEAST16_MIN */
633199482Srdivacky
634199482Srdivacky
635199482Srdivacky#ifdef __INT8_TYPE__
636199482Srdivacky# define INT8_MAX            INT8_C(127)
637199482Srdivacky# define INT8_MIN          (-INT8_C(127)-1)
638199482Srdivacky# define UINT8_MAX          UINT8_C(255)
639199482Srdivacky# define __INT_LEAST8_MIN    INT8_MIN
640199482Srdivacky# define __INT_LEAST8_MAX    INT8_MAX
641199482Srdivacky# define __UINT_LEAST8_MAX  UINT8_MAX
642199482Srdivacky#endif /* __INT8_TYPE__ */
643199482Srdivacky
644199482Srdivacky#ifdef __INT_LEAST8_MIN
645199482Srdivacky# define INT_LEAST8_MIN   __INT_LEAST8_MIN
646199482Srdivacky# define INT_LEAST8_MAX   __INT_LEAST8_MAX
647199482Srdivacky# define UINT_LEAST8_MAX __UINT_LEAST8_MAX
648199482Srdivacky# define INT_FAST8_MIN    __INT_LEAST8_MIN
649199482Srdivacky# define INT_FAST8_MAX    __INT_LEAST8_MAX
650199482Srdivacky# define UINT_FAST8_MAX  __UINT_LEAST8_MAX
651199482Srdivacky#endif /* __INT_LEAST8_MIN */
652199482Srdivacky
653221345Sdim/* Some utility macros */
654221345Sdim#define  __INTN_MIN(n)  __stdint_join3( INT, n, _MIN)
655221345Sdim#define  __INTN_MAX(n)  __stdint_join3( INT, n, _MAX)
656221345Sdim#define __UINTN_MAX(n)  __stdint_join3(UINT, n, _MAX)
657221345Sdim#define  __INTN_C(n, v) __stdint_join3( INT, n, _C(v))
658221345Sdim#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v))
659221345Sdim
660193326Sed/* C99 7.18.2.4 Limits of integer types capable of holding object pointers. */
661193326Sed/* C99 7.18.3 Limits of other integer types. */
662193326Sed
663199990Srdivacky#define  INTPTR_MIN  __INTN_MIN(__INTPTR_WIDTH__)
664199990Srdivacky#define  INTPTR_MAX  __INTN_MAX(__INTPTR_WIDTH__)
665199990Srdivacky#define UINTPTR_MAX __UINTN_MAX(__INTPTR_WIDTH__)
666199990Srdivacky#define PTRDIFF_MIN  __INTN_MIN(__PTRDIFF_WIDTH__)
667199990Srdivacky#define PTRDIFF_MAX  __INTN_MAX(__PTRDIFF_WIDTH__)
668199990Srdivacky#define    SIZE_MAX __UINTN_MAX(__SIZE_WIDTH__)
669199512Srdivacky
670252723Sdim/* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__
671252723Sdim * is enabled. */
672252723Sdim#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
673252723Sdim#define   RSIZE_MAX            (SIZE_MAX >> 1)
674252723Sdim#endif
675252723Sdim
676193326Sed/* C99 7.18.2.5 Limits of greatest-width integer types. */
677199990Srdivacky#define INTMAX_MIN   __INTN_MIN(__INTMAX_WIDTH__)
678199990Srdivacky#define INTMAX_MAX   __INTN_MAX(__INTMAX_WIDTH__)
679199990Srdivacky#define UINTMAX_MAX __UINTN_MAX(__INTMAX_WIDTH__)
680193326Sed
681193326Sed/* C99 7.18.3 Limits of other integer types. */
682199990Srdivacky#define SIG_ATOMIC_MIN __INTN_MIN(__SIG_ATOMIC_WIDTH__)
683199990Srdivacky#define SIG_ATOMIC_MAX __INTN_MAX(__SIG_ATOMIC_WIDTH__)
684221345Sdim#ifdef __WINT_UNSIGNED__
685221345Sdim# define WINT_MIN       __UINTN_C(__WINT_WIDTH__, 0)
686221345Sdim# define WINT_MAX       __UINTN_MAX(__WINT_WIDTH__)
687221345Sdim#else
688221345Sdim# define WINT_MIN       __INTN_MIN(__WINT_WIDTH__)
689221345Sdim# define WINT_MAX       __INTN_MAX(__WINT_WIDTH__)
690221345Sdim#endif
691193326Sed
692193326Sed#ifndef WCHAR_MAX
693221345Sdim# define WCHAR_MAX __WCHAR_MAX__
694193326Sed#endif
695193326Sed#ifndef WCHAR_MIN
696221345Sdim# if __WCHAR_MAX__ == __INTN_MAX(__WCHAR_WIDTH__)
697221345Sdim#  define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__)
698221345Sdim# else
699221345Sdim#  define WCHAR_MIN __UINTN_C(__WCHAR_WIDTH__, 0)
700221345Sdim# endif
701193326Sed#endif
702193326Sed
703193326Sed/* 7.18.4.2 Macros for greatest-width integer constants. */
704199990Srdivacky#define INTMAX_C(v)   __INTN_C(__INTMAX_WIDTH__, v)
705199990Srdivacky#define UINTMAX_C(v) __UINTN_C(__INTMAX_WIDTH__, v)
706199990Srdivacky
707193326Sed#endif /* __STDC_HOSTED__ */
708193326Sed#endif /* __CLANG_STDINT_H */
709