1*7330f729Sjoerg /*===---- stddef.h - Basic type definitions --------------------------------=== 2*7330f729Sjoerg * 3*7330f729Sjoerg * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*7330f729Sjoerg * See https://llvm.org/LICENSE.txt for license information. 5*7330f729Sjoerg * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*7330f729Sjoerg * 7*7330f729Sjoerg *===-----------------------------------------------------------------------=== 8*7330f729Sjoerg */ 9*7330f729Sjoerg 10*7330f729Sjoerg #if !defined(__STDDEF_H) || defined(__need_ptrdiff_t) || \ 11*7330f729Sjoerg defined(__need_size_t) || defined(__need_wchar_t) || \ 12*7330f729Sjoerg defined(__need_NULL) || defined(__need_wint_t) 13*7330f729Sjoerg 14*7330f729Sjoerg #if !defined(__need_ptrdiff_t) && !defined(__need_size_t) && \ 15*7330f729Sjoerg !defined(__need_wchar_t) && !defined(__need_NULL) && \ 16*7330f729Sjoerg !defined(__need_wint_t) 17*7330f729Sjoerg /* Always define miscellaneous pieces when modules are available. */ 18*7330f729Sjoerg #if !__has_feature(modules) 19*7330f729Sjoerg #define __STDDEF_H 20*7330f729Sjoerg #endif 21*7330f729Sjoerg #define __need_ptrdiff_t 22*7330f729Sjoerg #define __need_size_t 23*7330f729Sjoerg #define __need_wchar_t 24*7330f729Sjoerg #define __need_NULL 25*7330f729Sjoerg #define __need_STDDEF_H_misc 26*7330f729Sjoerg /* __need_wint_t is intentionally not defined here. */ 27*7330f729Sjoerg #endif 28*7330f729Sjoerg 29*7330f729Sjoerg #if defined(__need_ptrdiff_t) 30*7330f729Sjoerg #if !defined(_PTRDIFF_T) || __has_feature(modules) 31*7330f729Sjoerg /* Always define ptrdiff_t when modules are available. */ 32*7330f729Sjoerg #if !__has_feature(modules) 33*7330f729Sjoerg #define _PTRDIFF_T 34*7330f729Sjoerg #endif 35*7330f729Sjoerg typedef __PTRDIFF_TYPE__ ptrdiff_t; 36*7330f729Sjoerg #endif 37*7330f729Sjoerg #undef __need_ptrdiff_t 38*7330f729Sjoerg #endif /* defined(__need_ptrdiff_t) */ 39*7330f729Sjoerg 40*7330f729Sjoerg #if defined(__need_size_t) 41*7330f729Sjoerg #if !defined(_SIZE_T) || __has_feature(modules) 42*7330f729Sjoerg /* Always define size_t when modules are available. */ 43*7330f729Sjoerg #if !__has_feature(modules) 44*7330f729Sjoerg #define _SIZE_T 45*7330f729Sjoerg #endif 46*7330f729Sjoerg typedef __SIZE_TYPE__ size_t; 47*7330f729Sjoerg #endif 48*7330f729Sjoerg #undef __need_size_t 49*7330f729Sjoerg #endif /*defined(__need_size_t) */ 50*7330f729Sjoerg 51*7330f729Sjoerg #if defined(__need_STDDEF_H_misc) 52*7330f729Sjoerg /* ISO9899:2011 7.20 (C11 Annex K): Define rsize_t if __STDC_WANT_LIB_EXT1__ is 53*7330f729Sjoerg * enabled. */ 54*7330f729Sjoerg #if (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 && \ 55*7330f729Sjoerg !defined(_RSIZE_T)) || __has_feature(modules) 56*7330f729Sjoerg /* Always define rsize_t when modules are available. */ 57*7330f729Sjoerg #if !__has_feature(modules) 58*7330f729Sjoerg #define _RSIZE_T 59*7330f729Sjoerg #endif 60*7330f729Sjoerg typedef __SIZE_TYPE__ rsize_t; 61*7330f729Sjoerg #endif 62*7330f729Sjoerg #endif /* defined(__need_STDDEF_H_misc) */ 63*7330f729Sjoerg 64*7330f729Sjoerg #if defined(__need_wchar_t) 65*7330f729Sjoerg #ifndef __cplusplus 66*7330f729Sjoerg /* Always define wchar_t when modules are available. */ 67*7330f729Sjoerg #if !defined(_WCHAR_T) || __has_feature(modules) 68*7330f729Sjoerg #if !__has_feature(modules) 69*7330f729Sjoerg #define _WCHAR_T 70*7330f729Sjoerg #if defined(_MSC_EXTENSIONS) 71*7330f729Sjoerg #define _WCHAR_T_DEFINED 72*7330f729Sjoerg #endif 73*7330f729Sjoerg #endif 74*7330f729Sjoerg typedef __WCHAR_TYPE__ wchar_t; 75*7330f729Sjoerg #endif 76*7330f729Sjoerg #endif 77*7330f729Sjoerg #undef __need_wchar_t 78*7330f729Sjoerg #endif /* defined(__need_wchar_t) */ 79*7330f729Sjoerg 80*7330f729Sjoerg #if defined(__need_NULL) 81*7330f729Sjoerg #undef NULL 82*7330f729Sjoerg #ifdef __cplusplus 83*7330f729Sjoerg # if !defined(__MINGW32__) && !defined(_MSC_VER) 84*7330f729Sjoerg # define NULL __null 85*7330f729Sjoerg # else 86*7330f729Sjoerg # define NULL 0 87*7330f729Sjoerg # endif 88*7330f729Sjoerg #else 89*7330f729Sjoerg # define NULL ((void*)0) 90*7330f729Sjoerg #endif 91*7330f729Sjoerg #ifdef __cplusplus 92*7330f729Sjoerg #if defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED) 93*7330f729Sjoerg namespace std { typedef decltype(nullptr) nullptr_t; } 94*7330f729Sjoerg using ::std::nullptr_t; 95*7330f729Sjoerg #endif 96*7330f729Sjoerg #endif 97*7330f729Sjoerg #undef __need_NULL 98*7330f729Sjoerg #endif /* defined(__need_NULL) */ 99*7330f729Sjoerg 100*7330f729Sjoerg #if defined(__need_STDDEF_H_misc) 101*7330f729Sjoerg #if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L 102*7330f729Sjoerg #include "__stddef_max_align_t.h" 103*7330f729Sjoerg #endif 104*7330f729Sjoerg #define offsetof(t, d) __builtin_offsetof(t, d) 105*7330f729Sjoerg #undef __need_STDDEF_H_misc 106*7330f729Sjoerg #endif /* defined(__need_STDDEF_H_misc) */ 107*7330f729Sjoerg 108*7330f729Sjoerg /* Some C libraries expect to see a wint_t here. Others (notably MinGW) will use 109*7330f729Sjoerg __WINT_TYPE__ directly; accommodate both by requiring __need_wint_t */ 110*7330f729Sjoerg #if defined(__need_wint_t) 111*7330f729Sjoerg /* Always define wint_t when modules are available. */ 112*7330f729Sjoerg #if !defined(_WINT_T) || __has_feature(modules) 113*7330f729Sjoerg #if !__has_feature(modules) 114*7330f729Sjoerg #define _WINT_T 115*7330f729Sjoerg #endif 116*7330f729Sjoerg typedef __WINT_TYPE__ wint_t; 117*7330f729Sjoerg #endif 118*7330f729Sjoerg #undef __need_wint_t 119*7330f729Sjoerg #endif /* __need_wint_t */ 120*7330f729Sjoerg 121*7330f729Sjoerg #endif 122