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>) 33251662Sdim 34251662Sdim// C99 7.18.3 Limits of other integer types 35251662Sdim// 36251662Sdim// Footnote 219, 220: C++ implementations should define these macros only when 37251662Sdim// __STDC_LIMIT_MACROS is defined before <stdint.h> is included. 38251662Sdim// 39251662Sdim// Footnote 222: C++ implementations should define these macros only when 40251662Sdim// __STDC_CONSTANT_MACROS is defined before <stdint.h> is included. 41251662Sdim// 42251662Sdim// C++11 [cstdint.syn]p2: 43251662Sdim// 44251662Sdim// The macros defined by <cstdint> are provided unconditionally. In particular, 45251662Sdim// the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS (mentioned in 46251662Sdim// footnotes 219, 220, and 222 in the C standard) play no role in C++. 47251662Sdim// 48251662Sdim// C11 removed the problematic footnotes. 49251662Sdim// 50251662Sdim// Work around this inconsistency by always defining those macros in C++ mode, 51251662Sdim// so that a C library implementation which follows the C99 standard can be 52251662Sdim// used in C++. 53251662Sdim# ifdef __cplusplus 54251662Sdim# if !defined(__STDC_LIMIT_MACROS) 55251662Sdim# define __STDC_LIMIT_MACROS 56251662Sdim# define __STDC_LIMIT_MACROS_DEFINED_BY_CLANG 57251662Sdim# endif 58251662Sdim# if !defined(__STDC_CONSTANT_MACROS) 59251662Sdim# define __STDC_CONSTANT_MACROS 60251662Sdim# define __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG 61251662Sdim# endif 62251662Sdim# endif 63251662Sdim 64193326Sed# include_next <stdint.h> 65251662Sdim 66251662Sdim# ifdef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG 67251662Sdim# undef __STDC_LIMIT_MACROS 68251662Sdim# undef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG 69251662Sdim# endif 70251662Sdim# ifdef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG 71251662Sdim# undef __STDC_CONSTANT_MACROS 72251662Sdim# undef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG 73251662Sdim# endif 74251662Sdim 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 670251662Sdim/* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__ 671251662Sdim * is enabled. */ 672251662Sdim#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 673251662Sdim#define RSIZE_MAX (SIZE_MAX >> 1) 674251662Sdim#endif 675251662Sdim 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