1193326Sed/*===---- stdint.h - Standard header for sized integer types --------------===*\
2193326Sed *
3353358Sdim * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim * See https://llvm.org/LICENSE.txt for license information.
5353358Sdim * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6193326Sed *
7193326Sed\*===----------------------------------------------------------------------===*/
8193326Sed
9193326Sed#ifndef __CLANG_STDINT_H
10353358Sdim// AIX system headers need stdint.h to be re-enterable while _STD_TYPES_T
11353358Sdim// is defined until an inclusion of it without _STD_TYPES_T occurs, in which
12353358Sdim// case the header guard macro is defined.
13353358Sdim#if !defined(_AIX) || !defined(_STD_TYPES_T) || !defined(__STDC_HOSTED__)
14193326Sed#define __CLANG_STDINT_H
15353358Sdim#endif
16193326Sed
17193326Sed/* If we're hosted, fall back to the system's stdint.h, which might have
18193326Sed * additional definitions.
19193326Sed */
20276479Sdim#if __STDC_HOSTED__ && __has_include_next(<stdint.h>)
21251662Sdim
22251662Sdim// C99 7.18.3 Limits of other integer types
23251662Sdim//
24251662Sdim//  Footnote 219, 220: C++ implementations should define these macros only when
25251662Sdim//  __STDC_LIMIT_MACROS is defined before <stdint.h> is included.
26251662Sdim//
27251662Sdim//  Footnote 222: C++ implementations should define these macros only when
28251662Sdim//  __STDC_CONSTANT_MACROS is defined before <stdint.h> is included.
29251662Sdim//
30251662Sdim// C++11 [cstdint.syn]p2:
31251662Sdim//
32251662Sdim//  The macros defined by <cstdint> are provided unconditionally. In particular,
33251662Sdim//  the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS (mentioned in
34251662Sdim//  footnotes 219, 220, and 222 in the C standard) play no role in C++.
35251662Sdim//
36251662Sdim// C11 removed the problematic footnotes.
37251662Sdim//
38251662Sdim// Work around this inconsistency by always defining those macros in C++ mode,
39251662Sdim// so that a C library implementation which follows the C99 standard can be
40251662Sdim// used in C++.
41251662Sdim# ifdef __cplusplus
42251662Sdim#  if !defined(__STDC_LIMIT_MACROS)
43251662Sdim#   define __STDC_LIMIT_MACROS
44251662Sdim#   define __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
45251662Sdim#  endif
46251662Sdim#  if !defined(__STDC_CONSTANT_MACROS)
47251662Sdim#   define __STDC_CONSTANT_MACROS
48251662Sdim#   define __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
49251662Sdim#  endif
50251662Sdim# endif
51251662Sdim
52193326Sed# include_next <stdint.h>
53251662Sdim
54251662Sdim# ifdef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
55251662Sdim#  undef __STDC_LIMIT_MACROS
56251662Sdim#  undef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
57251662Sdim# endif
58251662Sdim# ifdef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
59251662Sdim#  undef __STDC_CONSTANT_MACROS
60251662Sdim#  undef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
61251662Sdim# endif
62251662Sdim
63193326Sed#else
64193326Sed
65193326Sed/* C99 7.18.1.1 Exact-width integer types.
66193326Sed * C99 7.18.1.2 Minimum-width integer types.
67193326Sed * C99 7.18.1.3 Fastest minimum-width integer types.
68199482Srdivacky *
69296417Sdim * The standard requires that exact-width type be defined for 8-, 16-, 32-, and
70199482Srdivacky * 64-bit types if they are implemented. Other exact width types are optional.
71199482Srdivacky * This implementation defines an exact-width types for every integer width
72199482Srdivacky * that is represented in the standard integer types.
73199482Srdivacky *
74199482Srdivacky * The standard also requires minimum-width types be defined for 8-, 16-, 32-,
75199482Srdivacky * and 64-bit widths regardless of whether there are corresponding exact-width
76296417Sdim * types.
77199482Srdivacky *
78221345Sdim * To accommodate targets that are missing types that are exactly 8, 16, 32, or
79199482Srdivacky * 64 bits wide, this implementation takes an approach of cascading
80341825Sdim * redefinitions, redefining __int_leastN_t to successively smaller exact-width
81199482Srdivacky * types. It is therefore important that the types are defined in order of
82199482Srdivacky * descending widths.
83199482Srdivacky *
84199482Srdivacky * We currently assume that the minimum-width types and the fastest
85199482Srdivacky * minimum-width types are the same. This is allowed by the standard, but is
86199482Srdivacky * suboptimal.
87199482Srdivacky *
88199482Srdivacky * In violation of the standard, some targets do not implement a type that is
89296417Sdim * wide enough to represent all of the required widths (8-, 16-, 32-, 64-bit).
90221345Sdim * To accommodate these targets, a required minimum-width type is only
91199482Srdivacky * defined if there exists an exact-width type of equal or greater width.
92193326Sed */
93193326Sed
94198954Srdivacky#ifdef __INT64_TYPE__
95199482Srdivacky# ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
96276479Sdimtypedef __INT64_TYPE__ int64_t;
97199482Srdivacky# endif /* __int8_t_defined */
98276479Sdimtypedef __UINT64_TYPE__ uint64_t;
99199482Srdivacky# define __int_least64_t int64_t
100199482Srdivacky# define __uint_least64_t uint64_t
101199482Srdivacky# define __int_least32_t int64_t
102199482Srdivacky# define __uint_least32_t uint64_t
103199482Srdivacky# define __int_least16_t int64_t
104199482Srdivacky# define __uint_least16_t uint64_t
105199482Srdivacky# define __int_least8_t int64_t
106199482Srdivacky# define __uint_least8_t uint64_t
107199482Srdivacky#endif /* __INT64_TYPE__ */
108193326Sed
109199482Srdivacky#ifdef __int_least64_t
110199482Srdivackytypedef __int_least64_t int_least64_t;
111199482Srdivackytypedef __uint_least64_t uint_least64_t;
112199482Srdivackytypedef __int_least64_t int_fast64_t;
113199482Srdivackytypedef __uint_least64_t uint_fast64_t;
114199482Srdivacky#endif /* __int_least64_t */
115199482Srdivacky
116199482Srdivacky#ifdef __INT56_TYPE__
117276479Sdimtypedef __INT56_TYPE__ int56_t;
118276479Sdimtypedef __UINT56_TYPE__ uint56_t;
119199482Srdivackytypedef int56_t int_least56_t;
120199482Srdivackytypedef uint56_t uint_least56_t;
121199482Srdivackytypedef int56_t int_fast56_t;
122199482Srdivackytypedef uint56_t uint_fast56_t;
123199482Srdivacky# define __int_least32_t int56_t
124199482Srdivacky# define __uint_least32_t uint56_t
125199482Srdivacky# define __int_least16_t int56_t
126199482Srdivacky# define __uint_least16_t uint56_t
127199482Srdivacky# define __int_least8_t int56_t
128199482Srdivacky# define __uint_least8_t uint56_t
129199482Srdivacky#endif /* __INT56_TYPE__ */
130199482Srdivacky
131199482Srdivacky
132199482Srdivacky#ifdef __INT48_TYPE__
133276479Sdimtypedef __INT48_TYPE__ int48_t;
134276479Sdimtypedef __UINT48_TYPE__ uint48_t;
135199482Srdivackytypedef int48_t int_least48_t;
136199482Srdivackytypedef uint48_t uint_least48_t;
137199482Srdivackytypedef int48_t int_fast48_t;
138199482Srdivackytypedef uint48_t uint_fast48_t;
139199482Srdivacky# define __int_least32_t int48_t
140199482Srdivacky# define __uint_least32_t uint48_t
141199482Srdivacky# define __int_least16_t int48_t
142199482Srdivacky# define __uint_least16_t uint48_t
143199482Srdivacky# define __int_least8_t int48_t
144199482Srdivacky# define __uint_least8_t uint48_t
145199482Srdivacky#endif /* __INT48_TYPE__ */
146199482Srdivacky
147199482Srdivacky
148199482Srdivacky#ifdef __INT40_TYPE__
149276479Sdimtypedef __INT40_TYPE__ int40_t;
150276479Sdimtypedef __UINT40_TYPE__ uint40_t;
151199482Srdivackytypedef int40_t int_least40_t;
152199482Srdivackytypedef uint40_t uint_least40_t;
153199482Srdivackytypedef int40_t int_fast40_t;
154199482Srdivackytypedef uint40_t uint_fast40_t;
155199482Srdivacky# define __int_least32_t int40_t
156199482Srdivacky# define __uint_least32_t uint40_t
157199482Srdivacky# define __int_least16_t int40_t
158199482Srdivacky# define __uint_least16_t uint40_t
159199482Srdivacky# define __int_least8_t int40_t
160199482Srdivacky# define __uint_least8_t uint40_t
161199482Srdivacky#endif /* __INT40_TYPE__ */
162199482Srdivacky
163199482Srdivacky
164199482Srdivacky#ifdef __INT32_TYPE__
165199482Srdivacky
166199482Srdivacky# ifndef __int8_t_defined /* glibc sys/types.h also defines int32_t*/
167276479Sdimtypedef __INT32_TYPE__ int32_t;
168199482Srdivacky# endif /* __int8_t_defined */
169199482Srdivacky
170199482Srdivacky# ifndef __uint32_t_defined  /* more glibc compatibility */
171199482Srdivacky# define __uint32_t_defined
172276479Sdimtypedef __UINT32_TYPE__ uint32_t;
173199482Srdivacky# endif /* __uint32_t_defined */
174193326Sed
175199482Srdivacky# define __int_least32_t int32_t
176199482Srdivacky# define __uint_least32_t uint32_t
177199482Srdivacky# define __int_least16_t int32_t
178199482Srdivacky# define __uint_least16_t uint32_t
179199482Srdivacky# define __int_least8_t int32_t
180199482Srdivacky# define __uint_least8_t uint32_t
181199482Srdivacky#endif /* __INT32_TYPE__ */
182198954Srdivacky
183199482Srdivacky#ifdef __int_least32_t
184199482Srdivackytypedef __int_least32_t int_least32_t;
185199482Srdivackytypedef __uint_least32_t uint_least32_t;
186199482Srdivackytypedef __int_least32_t int_fast32_t;
187199482Srdivackytypedef __uint_least32_t uint_fast32_t;
188199482Srdivacky#endif /* __int_least32_t */
189199482Srdivacky
190199482Srdivacky#ifdef __INT24_TYPE__
191276479Sdimtypedef __INT24_TYPE__ int24_t;
192276479Sdimtypedef __UINT24_TYPE__ uint24_t;
193199482Srdivackytypedef int24_t int_least24_t;
194199482Srdivackytypedef uint24_t uint_least24_t;
195199482Srdivackytypedef int24_t int_fast24_t;
196199482Srdivackytypedef uint24_t uint_fast24_t;
197199482Srdivacky# define __int_least16_t int24_t
198199482Srdivacky# define __uint_least16_t uint24_t
199199482Srdivacky# define __int_least8_t int24_t
200199482Srdivacky# define __uint_least8_t uint24_t
201199482Srdivacky#endif /* __INT24_TYPE__ */
202199482Srdivacky
203199482Srdivacky#ifdef __INT16_TYPE__
204199482Srdivacky#ifndef __int8_t_defined /* glibc sys/types.h also defines int16_t*/
205276479Sdimtypedef __INT16_TYPE__ int16_t;
206199482Srdivacky#endif /* __int8_t_defined */
207276479Sdimtypedef __UINT16_TYPE__ uint16_t;
208199482Srdivacky# define __int_least16_t int16_t
209199482Srdivacky# define __uint_least16_t uint16_t
210199482Srdivacky# define __int_least8_t int16_t
211199482Srdivacky# define __uint_least8_t uint16_t
212199482Srdivacky#endif /* __INT16_TYPE__ */
213193326Sed
214199482Srdivacky#ifdef __int_least16_t
215199482Srdivackytypedef __int_least16_t int_least16_t;
216199482Srdivackytypedef __uint_least16_t uint_least16_t;
217199482Srdivackytypedef __int_least16_t int_fast16_t;
218199482Srdivackytypedef __uint_least16_t uint_fast16_t;
219199482Srdivacky#endif /* __int_least16_t */
220193326Sed
221199482Srdivacky
222199482Srdivacky#ifdef __INT8_TYPE__
223199482Srdivacky#ifndef __int8_t_defined  /* glibc sys/types.h also defines int8_t*/
224276479Sdimtypedef __INT8_TYPE__ int8_t;
225199482Srdivacky#endif /* __int8_t_defined */
226276479Sdimtypedef __UINT8_TYPE__ uint8_t;
227199482Srdivacky# define __int_least8_t int8_t
228199482Srdivacky# define __uint_least8_t uint8_t
229199482Srdivacky#endif /* __INT8_TYPE__ */
230198954Srdivacky
231199482Srdivacky#ifdef __int_least8_t
232199482Srdivackytypedef __int_least8_t int_least8_t;
233199482Srdivackytypedef __uint_least8_t uint_least8_t;
234199482Srdivackytypedef __int_least8_t int_fast8_t;
235199482Srdivackytypedef __uint_least8_t uint_fast8_t;
236199482Srdivacky#endif /* __int_least8_t */
237199482Srdivacky
238198954Srdivacky/* prevent glibc sys/types.h from defining conflicting types */
239296417Sdim#ifndef __int8_t_defined
240198954Srdivacky# define __int8_t_defined
241198954Srdivacky#endif /* __int8_t_defined */
242198954Srdivacky
243193326Sed/* C99 7.18.1.4 Integer types capable of holding object pointers.
244193326Sed */
245199512Srdivacky#define __stdint_join3(a,b,c) a ## b ## c
246199512Srdivacky
247207619Srdivacky#ifndef _INTPTR_T
248193326Sed#ifndef __intptr_t_defined
249321369Sdimtypedef __INTPTR_TYPE__ intptr_t;
250193326Sed#define __intptr_t_defined
251207619Srdivacky#define _INTPTR_T
252193326Sed#endif
253207619Srdivacky#endif
254207619Srdivacky
255207619Srdivacky#ifndef _UINTPTR_T
256321369Sdimtypedef __UINTPTR_TYPE__ uintptr_t;
257207619Srdivacky#define _UINTPTR_T
258207619Srdivacky#endif
259193326Sed
260193326Sed/* C99 7.18.1.5 Greatest-width integer types.
261193326Sed */
262210299Sedtypedef __INTMAX_TYPE__  intmax_t;
263210299Sedtypedef __UINTMAX_TYPE__ uintmax_t;
264193326Sed
265198954Srdivacky/* C99 7.18.4 Macros for minimum-width integer constants.
266198954Srdivacky *
267199482Srdivacky * The standard requires that integer constant macros be defined for all the
268199482Srdivacky * minimum-width types defined above. As 8-, 16-, 32-, and 64-bit minimum-width
269296417Sdim * types are required, the corresponding integer constant macros are defined
270199482Srdivacky * here. This implementation also defines minimum-width types for every other
271296417Sdim * integer width that the target implements, so corresponding macros are
272199482Srdivacky * defined below, too.
273199482Srdivacky *
274199482Srdivacky * These macros are defined using the same successive-shrinking approach as
275199482Srdivacky * the type definitions above. It is likewise important that macros are defined
276199482Srdivacky * in order of decending width.
277199482Srdivacky *
278198954Srdivacky * Note that C++ should not check __STDC_CONSTANT_MACROS here, contrary to the
279198954Srdivacky * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]).
280198954Srdivacky */
281198954Srdivacky
282199482Srdivacky#define __int_c_join(a, b) a ## b
283199482Srdivacky#define __int_c(v, suffix) __int_c_join(v, suffix)
284199482Srdivacky#define __uint_c(v, suffix) __int_c_join(v##U, suffix)
285199482Srdivacky
286199482Srdivacky
287198954Srdivacky#ifdef __INT64_TYPE__
288199482Srdivacky# ifdef __INT64_C_SUFFIX__
289199482Srdivacky#  define __int64_c_suffix __INT64_C_SUFFIX__
290199482Srdivacky#  define __int32_c_suffix __INT64_C_SUFFIX__
291199482Srdivacky#  define __int16_c_suffix __INT64_C_SUFFIX__
292199482Srdivacky#  define  __int8_c_suffix __INT64_C_SUFFIX__
293199482Srdivacky# else
294199482Srdivacky#  undef __int64_c_suffix
295199482Srdivacky#  undef __int32_c_suffix
296199482Srdivacky#  undef __int16_c_suffix
297199482Srdivacky#  undef  __int8_c_suffix
298199482Srdivacky# endif /* __INT64_C_SUFFIX__ */
299199482Srdivacky#endif /* __INT64_TYPE__ */
300198954Srdivacky
301199482Srdivacky#ifdef __int_least64_t
302199482Srdivacky# ifdef __int64_c_suffix
303199482Srdivacky#  define INT64_C(v) __int_c(v, __int64_c_suffix)
304199482Srdivacky#  define UINT64_C(v) __uint_c(v, __int64_c_suffix)
305199482Srdivacky# else
306199482Srdivacky#  define INT64_C(v) v
307199482Srdivacky#  define UINT64_C(v) v ## U
308199482Srdivacky# endif /* __int64_c_suffix */
309199482Srdivacky#endif /* __int_least64_t */
310198954Srdivacky
311199482Srdivacky
312199482Srdivacky#ifdef __INT56_TYPE__
313199482Srdivacky# ifdef __INT56_C_SUFFIX__
314199482Srdivacky#  define INT56_C(v) __int_c(v, __INT56_C_SUFFIX__)
315199482Srdivacky#  define UINT56_C(v) __uint_c(v, __INT56_C_SUFFIX__)
316199482Srdivacky#  define __int32_c_suffix __INT56_C_SUFFIX__
317199482Srdivacky#  define __int16_c_suffix __INT56_C_SUFFIX__
318199482Srdivacky#  define __int8_c_suffix  __INT56_C_SUFFIX__
319199482Srdivacky# else
320199482Srdivacky#  define INT56_C(v) v
321199482Srdivacky#  define UINT56_C(v) v ## U
322199482Srdivacky#  undef __int32_c_suffix
323199482Srdivacky#  undef __int16_c_suffix
324199482Srdivacky#  undef  __int8_c_suffix
325199482Srdivacky# endif /* __INT56_C_SUFFIX__ */
326199482Srdivacky#endif /* __INT56_TYPE__ */
327199482Srdivacky
328199482Srdivacky
329199482Srdivacky#ifdef __INT48_TYPE__
330199482Srdivacky# ifdef __INT48_C_SUFFIX__
331199482Srdivacky#  define INT48_C(v) __int_c(v, __INT48_C_SUFFIX__)
332199482Srdivacky#  define UINT48_C(v) __uint_c(v, __INT48_C_SUFFIX__)
333199482Srdivacky#  define __int32_c_suffix __INT48_C_SUFFIX__
334199482Srdivacky#  define __int16_c_suffix __INT48_C_SUFFIX__
335199482Srdivacky#  define __int8_c_suffix  __INT48_C_SUFFIX__
336199482Srdivacky# else
337199482Srdivacky#  define INT48_C(v) v
338199482Srdivacky#  define UINT48_C(v) v ## U
339199482Srdivacky#  undef __int32_c_suffix
340199482Srdivacky#  undef __int16_c_suffix
341199482Srdivacky#  undef  __int8_c_suffix
342199482Srdivacky# endif /* __INT48_C_SUFFIX__ */
343199482Srdivacky#endif /* __INT48_TYPE__ */
344199482Srdivacky
345199482Srdivacky
346199482Srdivacky#ifdef __INT40_TYPE__
347199482Srdivacky# ifdef __INT40_C_SUFFIX__
348199482Srdivacky#  define INT40_C(v) __int_c(v, __INT40_C_SUFFIX__)
349199482Srdivacky#  define UINT40_C(v) __uint_c(v, __INT40_C_SUFFIX__)
350199482Srdivacky#  define __int32_c_suffix __INT40_C_SUFFIX__
351199482Srdivacky#  define __int16_c_suffix __INT40_C_SUFFIX__
352199482Srdivacky#  define __int8_c_suffix  __INT40_C_SUFFIX__
353199482Srdivacky# else
354199482Srdivacky#  define INT40_C(v) v
355199482Srdivacky#  define UINT40_C(v) v ## U
356199482Srdivacky#  undef __int32_c_suffix
357199482Srdivacky#  undef __int16_c_suffix
358199482Srdivacky#  undef  __int8_c_suffix
359199482Srdivacky# endif /* __INT40_C_SUFFIX__ */
360199482Srdivacky#endif /* __INT40_TYPE__ */
361199482Srdivacky
362199482Srdivacky
363199482Srdivacky#ifdef __INT32_TYPE__
364199482Srdivacky# ifdef __INT32_C_SUFFIX__
365199482Srdivacky#  define __int32_c_suffix __INT32_C_SUFFIX__
366199482Srdivacky#  define __int16_c_suffix __INT32_C_SUFFIX__
367199482Srdivacky#  define __int8_c_suffix  __INT32_C_SUFFIX__
368199482Srdivacky#else
369199482Srdivacky#  undef __int32_c_suffix
370199482Srdivacky#  undef __int16_c_suffix
371199482Srdivacky#  undef  __int8_c_suffix
372199482Srdivacky# endif /* __INT32_C_SUFFIX__ */
373199482Srdivacky#endif /* __INT32_TYPE__ */
374199482Srdivacky
375199482Srdivacky#ifdef __int_least32_t
376199482Srdivacky# ifdef __int32_c_suffix
377199482Srdivacky#  define INT32_C(v) __int_c(v, __int32_c_suffix)
378199482Srdivacky#  define UINT32_C(v) __uint_c(v, __int32_c_suffix)
379199482Srdivacky# else
380199482Srdivacky#  define INT32_C(v) v
381199482Srdivacky#  define UINT32_C(v) v ## U
382199482Srdivacky# endif /* __int32_c_suffix */
383199482Srdivacky#endif /* __int_least32_t */
384199482Srdivacky
385199482Srdivacky
386199482Srdivacky#ifdef __INT24_TYPE__
387199482Srdivacky# ifdef __INT24_C_SUFFIX__
388199482Srdivacky#  define INT24_C(v) __int_c(v, __INT24_C_SUFFIX__)
389199482Srdivacky#  define UINT24_C(v) __uint_c(v, __INT24_C_SUFFIX__)
390199482Srdivacky#  define __int16_c_suffix __INT24_C_SUFFIX__
391199482Srdivacky#  define __int8_c_suffix  __INT24_C_SUFFIX__
392199482Srdivacky# else
393199482Srdivacky#  define INT24_C(v) v
394199482Srdivacky#  define UINT24_C(v) v ## U
395199482Srdivacky#  undef __int16_c_suffix
396199482Srdivacky#  undef  __int8_c_suffix
397199482Srdivacky# endif /* __INT24_C_SUFFIX__ */
398199482Srdivacky#endif /* __INT24_TYPE__ */
399199482Srdivacky
400199482Srdivacky
401199482Srdivacky#ifdef __INT16_TYPE__
402199482Srdivacky# ifdef __INT16_C_SUFFIX__
403199482Srdivacky#  define __int16_c_suffix __INT16_C_SUFFIX__
404199482Srdivacky#  define __int8_c_suffix  __INT16_C_SUFFIX__
405199482Srdivacky#else
406199482Srdivacky#  undef __int16_c_suffix
407199482Srdivacky#  undef  __int8_c_suffix
408199482Srdivacky# endif /* __INT16_C_SUFFIX__ */
409199482Srdivacky#endif /* __INT16_TYPE__ */
410199482Srdivacky
411199482Srdivacky#ifdef __int_least16_t
412199482Srdivacky# ifdef __int16_c_suffix
413199482Srdivacky#  define INT16_C(v) __int_c(v, __int16_c_suffix)
414199482Srdivacky#  define UINT16_C(v) __uint_c(v, __int16_c_suffix)
415199482Srdivacky# else
416199482Srdivacky#  define INT16_C(v) v
417199482Srdivacky#  define UINT16_C(v) v ## U
418199482Srdivacky# endif /* __int16_c_suffix */
419199482Srdivacky#endif /* __int_least16_t */
420199482Srdivacky
421199482Srdivacky
422199482Srdivacky#ifdef __INT8_TYPE__
423199482Srdivacky# ifdef __INT8_C_SUFFIX__
424199482Srdivacky#  define __int8_c_suffix __INT8_C_SUFFIX__
425199482Srdivacky#else
426199482Srdivacky#  undef  __int8_c_suffix
427199482Srdivacky# endif /* __INT8_C_SUFFIX__ */
428199482Srdivacky#endif /* __INT8_TYPE__ */
429199482Srdivacky
430199482Srdivacky#ifdef __int_least8_t
431199482Srdivacky# ifdef __int8_c_suffix
432199482Srdivacky#  define INT8_C(v) __int_c(v, __int8_c_suffix)
433199482Srdivacky#  define UINT8_C(v) __uint_c(v, __int8_c_suffix)
434199482Srdivacky# else
435199482Srdivacky#  define INT8_C(v) v
436199482Srdivacky#  define UINT8_C(v) v ## U
437199482Srdivacky# endif /* __int8_c_suffix */
438199482Srdivacky#endif /* __int_least8_t */
439199482Srdivacky
440199482Srdivacky
441296417Sdim/* C99 7.18.2.1 Limits of exact-width integer types.
442193326Sed * C99 7.18.2.2 Limits of minimum-width integer types.
443193326Sed * C99 7.18.2.3 Limits of fastest minimum-width integer types.
444193326Sed *
445199482Srdivacky * The presence of limit macros are completely optional in C99.  This
446199482Srdivacky * implementation defines limits for all of the types (exact- and
447199482Srdivacky * minimum-width) that it defines above, using the limits of the minimum-width
448199482Srdivacky * type for any types that do not have exact-width representations.
449199482Srdivacky *
450199482Srdivacky * As in the type definitions, this section takes an approach of
451199482Srdivacky * successive-shrinking to determine which limits to use for the standard (8,
452199482Srdivacky * 16, 32, 64) bit widths when they don't have exact representations. It is
453341825Sdim * therefore important that the definitions be kept in order of decending
454199482Srdivacky * widths.
455199482Srdivacky *
456193326Sed * Note that C++ should not check __STDC_LIMIT_MACROS here, contrary to the
457193326Sed * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]).
458193326Sed */
459193326Sed
460193326Sed#ifdef __INT64_TYPE__
461199482Srdivacky# define INT64_MAX           INT64_C( 9223372036854775807)
462199482Srdivacky# define INT64_MIN         (-INT64_C( 9223372036854775807)-1)
463199482Srdivacky# define UINT64_MAX         UINT64_C(18446744073709551615)
464199482Srdivacky# define __INT_LEAST64_MIN   INT64_MIN
465199482Srdivacky# define __INT_LEAST64_MAX   INT64_MAX
466199482Srdivacky# define __UINT_LEAST64_MAX UINT64_MAX
467199482Srdivacky# define __INT_LEAST32_MIN   INT64_MIN
468199482Srdivacky# define __INT_LEAST32_MAX   INT64_MAX
469199482Srdivacky# define __UINT_LEAST32_MAX UINT64_MAX
470199482Srdivacky# define __INT_LEAST16_MIN   INT64_MIN
471199482Srdivacky# define __INT_LEAST16_MAX   INT64_MAX
472199482Srdivacky# define __UINT_LEAST16_MAX UINT64_MAX
473199482Srdivacky# define __INT_LEAST8_MIN    INT64_MIN
474199482Srdivacky# define __INT_LEAST8_MAX    INT64_MAX
475199482Srdivacky# define __UINT_LEAST8_MAX  UINT64_MAX
476199482Srdivacky#endif /* __INT64_TYPE__ */
477193326Sed
478199482Srdivacky#ifdef __INT_LEAST64_MIN
479199482Srdivacky# define INT_LEAST64_MIN   __INT_LEAST64_MIN
480199482Srdivacky# define INT_LEAST64_MAX   __INT_LEAST64_MAX
481199482Srdivacky# define UINT_LEAST64_MAX __UINT_LEAST64_MAX
482199482Srdivacky# define INT_FAST64_MIN    __INT_LEAST64_MIN
483199482Srdivacky# define INT_FAST64_MAX    __INT_LEAST64_MAX
484199482Srdivacky# define UINT_FAST64_MAX  __UINT_LEAST64_MAX
485199482Srdivacky#endif /* __INT_LEAST64_MIN */
486198954Srdivacky
487198954Srdivacky
488199482Srdivacky#ifdef __INT56_TYPE__
489199482Srdivacky# define INT56_MAX           INT56_C(36028797018963967)
490199482Srdivacky# define INT56_MIN         (-INT56_C(36028797018963967)-1)
491199482Srdivacky# define UINT56_MAX         UINT56_C(72057594037927935)
492199482Srdivacky# define INT_LEAST56_MIN     INT56_MIN
493199482Srdivacky# define INT_LEAST56_MAX     INT56_MAX
494199482Srdivacky# define UINT_LEAST56_MAX   UINT56_MAX
495199482Srdivacky# define INT_FAST56_MIN      INT56_MIN
496199482Srdivacky# define INT_FAST56_MAX      INT56_MAX
497199482Srdivacky# define UINT_FAST56_MAX    UINT56_MAX
498199482Srdivacky# define __INT_LEAST32_MIN   INT56_MIN
499199482Srdivacky# define __INT_LEAST32_MAX   INT56_MAX
500199482Srdivacky# define __UINT_LEAST32_MAX UINT56_MAX
501199482Srdivacky# define __INT_LEAST16_MIN   INT56_MIN
502199482Srdivacky# define __INT_LEAST16_MAX   INT56_MAX
503199482Srdivacky# define __UINT_LEAST16_MAX UINT56_MAX
504199482Srdivacky# define __INT_LEAST8_MIN    INT56_MIN
505199482Srdivacky# define __INT_LEAST8_MAX    INT56_MAX
506199482Srdivacky# define __UINT_LEAST8_MAX  UINT56_MAX
507199482Srdivacky#endif /* __INT56_TYPE__ */
508198954Srdivacky
509199482Srdivacky
510199482Srdivacky#ifdef __INT48_TYPE__
511199482Srdivacky# define INT48_MAX           INT48_C(140737488355327)
512199482Srdivacky# define INT48_MIN         (-INT48_C(140737488355327)-1)
513199482Srdivacky# define UINT48_MAX         UINT48_C(281474976710655)
514199482Srdivacky# define INT_LEAST48_MIN     INT48_MIN
515199482Srdivacky# define INT_LEAST48_MAX     INT48_MAX
516199482Srdivacky# define UINT_LEAST48_MAX   UINT48_MAX
517199482Srdivacky# define INT_FAST48_MIN      INT48_MIN
518199482Srdivacky# define INT_FAST48_MAX      INT48_MAX
519199482Srdivacky# define UINT_FAST48_MAX    UINT48_MAX
520199482Srdivacky# define __INT_LEAST32_MIN   INT48_MIN
521199482Srdivacky# define __INT_LEAST32_MAX   INT48_MAX
522199482Srdivacky# define __UINT_LEAST32_MAX UINT48_MAX
523199482Srdivacky# define __INT_LEAST16_MIN   INT48_MIN
524199482Srdivacky# define __INT_LEAST16_MAX   INT48_MAX
525199482Srdivacky# define __UINT_LEAST16_MAX UINT48_MAX
526199482Srdivacky# define __INT_LEAST8_MIN    INT48_MIN
527199482Srdivacky# define __INT_LEAST8_MAX    INT48_MAX
528199482Srdivacky# define __UINT_LEAST8_MAX  UINT48_MAX
529199482Srdivacky#endif /* __INT48_TYPE__ */
530199482Srdivacky
531199482Srdivacky
532199482Srdivacky#ifdef __INT40_TYPE__
533199482Srdivacky# define INT40_MAX           INT40_C(549755813887)
534199482Srdivacky# define INT40_MIN         (-INT40_C(549755813887)-1)
535199482Srdivacky# define UINT40_MAX         UINT40_C(1099511627775)
536199482Srdivacky# define INT_LEAST40_MIN     INT40_MIN
537199482Srdivacky# define INT_LEAST40_MAX     INT40_MAX
538199482Srdivacky# define UINT_LEAST40_MAX   UINT40_MAX
539199482Srdivacky# define INT_FAST40_MIN      INT40_MIN
540199482Srdivacky# define INT_FAST40_MAX      INT40_MAX
541199482Srdivacky# define UINT_FAST40_MAX    UINT40_MAX
542199482Srdivacky# define __INT_LEAST32_MIN   INT40_MIN
543199482Srdivacky# define __INT_LEAST32_MAX   INT40_MAX
544199482Srdivacky# define __UINT_LEAST32_MAX UINT40_MAX
545199482Srdivacky# define __INT_LEAST16_MIN   INT40_MIN
546199482Srdivacky# define __INT_LEAST16_MAX   INT40_MAX
547199482Srdivacky# define __UINT_LEAST16_MAX UINT40_MAX
548199482Srdivacky# define __INT_LEAST8_MIN    INT40_MIN
549199482Srdivacky# define __INT_LEAST8_MAX    INT40_MAX
550199482Srdivacky# define __UINT_LEAST8_MAX  UINT40_MAX
551199482Srdivacky#endif /* __INT40_TYPE__ */
552199482Srdivacky
553199482Srdivacky
554199482Srdivacky#ifdef __INT32_TYPE__
555199482Srdivacky# define INT32_MAX           INT32_C(2147483647)
556199482Srdivacky# define INT32_MIN         (-INT32_C(2147483647)-1)
557199482Srdivacky# define UINT32_MAX         UINT32_C(4294967295)
558199482Srdivacky# define __INT_LEAST32_MIN   INT32_MIN
559199482Srdivacky# define __INT_LEAST32_MAX   INT32_MAX
560199482Srdivacky# define __UINT_LEAST32_MAX UINT32_MAX
561199482Srdivacky# define __INT_LEAST16_MIN   INT32_MIN
562199482Srdivacky# define __INT_LEAST16_MAX   INT32_MAX
563199482Srdivacky# define __UINT_LEAST16_MAX UINT32_MAX
564199482Srdivacky# define __INT_LEAST8_MIN    INT32_MIN
565199482Srdivacky# define __INT_LEAST8_MAX    INT32_MAX
566199482Srdivacky# define __UINT_LEAST8_MAX  UINT32_MAX
567199482Srdivacky#endif /* __INT32_TYPE__ */
568199482Srdivacky
569199482Srdivacky#ifdef __INT_LEAST32_MIN
570199482Srdivacky# define INT_LEAST32_MIN   __INT_LEAST32_MIN
571199482Srdivacky# define INT_LEAST32_MAX   __INT_LEAST32_MAX
572199482Srdivacky# define UINT_LEAST32_MAX __UINT_LEAST32_MAX
573199482Srdivacky# define INT_FAST32_MIN    __INT_LEAST32_MIN
574199482Srdivacky# define INT_FAST32_MAX    __INT_LEAST32_MAX
575199482Srdivacky# define UINT_FAST32_MAX  __UINT_LEAST32_MAX
576199482Srdivacky#endif /* __INT_LEAST32_MIN */
577199482Srdivacky
578199482Srdivacky
579199482Srdivacky#ifdef __INT24_TYPE__
580199482Srdivacky# define INT24_MAX           INT24_C(8388607)
581199482Srdivacky# define INT24_MIN         (-INT24_C(8388607)-1)
582199482Srdivacky# define UINT24_MAX         UINT24_C(16777215)
583199482Srdivacky# define INT_LEAST24_MIN     INT24_MIN
584199482Srdivacky# define INT_LEAST24_MAX     INT24_MAX
585199482Srdivacky# define UINT_LEAST24_MAX   UINT24_MAX
586199482Srdivacky# define INT_FAST24_MIN      INT24_MIN
587199482Srdivacky# define INT_FAST24_MAX      INT24_MAX
588199482Srdivacky# define UINT_FAST24_MAX    UINT24_MAX
589199482Srdivacky# define __INT_LEAST16_MIN   INT24_MIN
590199482Srdivacky# define __INT_LEAST16_MAX   INT24_MAX
591199482Srdivacky# define __UINT_LEAST16_MAX UINT24_MAX
592199482Srdivacky# define __INT_LEAST8_MIN    INT24_MIN
593199482Srdivacky# define __INT_LEAST8_MAX    INT24_MAX
594199482Srdivacky# define __UINT_LEAST8_MAX  UINT24_MAX
595199482Srdivacky#endif /* __INT24_TYPE__ */
596199482Srdivacky
597199482Srdivacky
598199482Srdivacky#ifdef __INT16_TYPE__
599199482Srdivacky#define INT16_MAX            INT16_C(32767)
600199482Srdivacky#define INT16_MIN          (-INT16_C(32767)-1)
601199482Srdivacky#define UINT16_MAX          UINT16_C(65535)
602199482Srdivacky# define __INT_LEAST16_MIN   INT16_MIN
603199482Srdivacky# define __INT_LEAST16_MAX   INT16_MAX
604199482Srdivacky# define __UINT_LEAST16_MAX UINT16_MAX
605199482Srdivacky# define __INT_LEAST8_MIN    INT16_MIN
606199482Srdivacky# define __INT_LEAST8_MAX    INT16_MAX
607199482Srdivacky# define __UINT_LEAST8_MAX  UINT16_MAX
608199482Srdivacky#endif /* __INT16_TYPE__ */
609199482Srdivacky
610199482Srdivacky#ifdef __INT_LEAST16_MIN
611199482Srdivacky# define INT_LEAST16_MIN   __INT_LEAST16_MIN
612199482Srdivacky# define INT_LEAST16_MAX   __INT_LEAST16_MAX
613199482Srdivacky# define UINT_LEAST16_MAX __UINT_LEAST16_MAX
614199482Srdivacky# define INT_FAST16_MIN    __INT_LEAST16_MIN
615199482Srdivacky# define INT_FAST16_MAX    __INT_LEAST16_MAX
616199482Srdivacky# define UINT_FAST16_MAX  __UINT_LEAST16_MAX
617199482Srdivacky#endif /* __INT_LEAST16_MIN */
618199482Srdivacky
619199482Srdivacky
620199482Srdivacky#ifdef __INT8_TYPE__
621199482Srdivacky# define INT8_MAX            INT8_C(127)
622199482Srdivacky# define INT8_MIN          (-INT8_C(127)-1)
623199482Srdivacky# define UINT8_MAX          UINT8_C(255)
624199482Srdivacky# define __INT_LEAST8_MIN    INT8_MIN
625199482Srdivacky# define __INT_LEAST8_MAX    INT8_MAX
626199482Srdivacky# define __UINT_LEAST8_MAX  UINT8_MAX
627199482Srdivacky#endif /* __INT8_TYPE__ */
628199482Srdivacky
629199482Srdivacky#ifdef __INT_LEAST8_MIN
630199482Srdivacky# define INT_LEAST8_MIN   __INT_LEAST8_MIN
631199482Srdivacky# define INT_LEAST8_MAX   __INT_LEAST8_MAX
632199482Srdivacky# define UINT_LEAST8_MAX __UINT_LEAST8_MAX
633199482Srdivacky# define INT_FAST8_MIN    __INT_LEAST8_MIN
634199482Srdivacky# define INT_FAST8_MAX    __INT_LEAST8_MAX
635199482Srdivacky# define UINT_FAST8_MAX  __UINT_LEAST8_MAX
636199482Srdivacky#endif /* __INT_LEAST8_MIN */
637199482Srdivacky
638221345Sdim/* Some utility macros */
639221345Sdim#define  __INTN_MIN(n)  __stdint_join3( INT, n, _MIN)
640221345Sdim#define  __INTN_MAX(n)  __stdint_join3( INT, n, _MAX)
641221345Sdim#define __UINTN_MAX(n)  __stdint_join3(UINT, n, _MAX)
642221345Sdim#define  __INTN_C(n, v) __stdint_join3( INT, n, _C(v))
643221345Sdim#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v))
644221345Sdim
645193326Sed/* C99 7.18.2.4 Limits of integer types capable of holding object pointers. */
646193326Sed/* C99 7.18.3 Limits of other integer types. */
647193326Sed
648321369Sdim#define  INTPTR_MIN  (-__INTPTR_MAX__-1)
649321369Sdim#define  INTPTR_MAX    __INTPTR_MAX__
650321369Sdim#define UINTPTR_MAX   __UINTPTR_MAX__
651321369Sdim#define PTRDIFF_MIN (-__PTRDIFF_MAX__-1)
652321369Sdim#define PTRDIFF_MAX   __PTRDIFF_MAX__
653321369Sdim#define    SIZE_MAX      __SIZE_MAX__
654199512Srdivacky
655251662Sdim/* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__
656251662Sdim * is enabled. */
657251662Sdim#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
658251662Sdim#define   RSIZE_MAX            (SIZE_MAX >> 1)
659251662Sdim#endif
660251662Sdim
661193326Sed/* C99 7.18.2.5 Limits of greatest-width integer types. */
662321369Sdim#define  INTMAX_MIN (-__INTMAX_MAX__-1)
663321369Sdim#define  INTMAX_MAX   __INTMAX_MAX__
664321369Sdim#define UINTMAX_MAX  __UINTMAX_MAX__
665193326Sed
666193326Sed/* C99 7.18.3 Limits of other integer types. */
667199990Srdivacky#define SIG_ATOMIC_MIN __INTN_MIN(__SIG_ATOMIC_WIDTH__)
668199990Srdivacky#define SIG_ATOMIC_MAX __INTN_MAX(__SIG_ATOMIC_WIDTH__)
669221345Sdim#ifdef __WINT_UNSIGNED__
670221345Sdim# define WINT_MIN       __UINTN_C(__WINT_WIDTH__, 0)
671221345Sdim# define WINT_MAX       __UINTN_MAX(__WINT_WIDTH__)
672221345Sdim#else
673221345Sdim# define WINT_MIN       __INTN_MIN(__WINT_WIDTH__)
674221345Sdim# define WINT_MAX       __INTN_MAX(__WINT_WIDTH__)
675221345Sdim#endif
676193326Sed
677193326Sed#ifndef WCHAR_MAX
678221345Sdim# define WCHAR_MAX __WCHAR_MAX__
679193326Sed#endif
680193326Sed#ifndef WCHAR_MIN
681221345Sdim# if __WCHAR_MAX__ == __INTN_MAX(__WCHAR_WIDTH__)
682221345Sdim#  define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__)
683221345Sdim# else
684221345Sdim#  define WCHAR_MIN __UINTN_C(__WCHAR_WIDTH__, 0)
685221345Sdim# endif
686193326Sed#endif
687193326Sed
688193326Sed/* 7.18.4.2 Macros for greatest-width integer constants. */
689321369Sdim#define  INTMAX_C(v) __int_c(v,  __INTMAX_C_SUFFIX__)
690321369Sdim#define UINTMAX_C(v) __int_c(v, __UINTMAX_C_SUFFIX__)
691199990Srdivacky
692193326Sed#endif /* __STDC_HOSTED__ */
693193326Sed#endif /* __CLANG_STDINT_H */
694