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