1193326Sed/*===---- stddef.h - Basic type definitions --------------------------------=== 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 10276479Sdim#if !defined(__STDDEF_H) || defined(__need_ptrdiff_t) || \ 11276479Sdim defined(__need_size_t) || defined(__need_wchar_t) || \ 12276479Sdim defined(__need_NULL) || defined(__need_wint_t) 13276479Sdim 14276479Sdim#if !defined(__need_ptrdiff_t) && !defined(__need_size_t) && \ 15276479Sdim !defined(__need_wchar_t) && !defined(__need_NULL) && \ 16276479Sdim !defined(__need_wint_t) 17280031Sdim/* Always define miscellaneous pieces when modules are available. */ 18280031Sdim#if !__has_feature(modules) 19193326Sed#define __STDDEF_H 20280031Sdim#endif 21276479Sdim#define __need_ptrdiff_t 22276479Sdim#define __need_size_t 23276479Sdim#define __need_wchar_t 24276479Sdim#define __need_NULL 25280031Sdim#define __need_STDDEF_H_misc 26276479Sdim/* __need_wint_t is intentionally not defined here. */ 27276479Sdim#endif 28193326Sed 29276479Sdim#if defined(__need_ptrdiff_t) 30249423Sdim#if !defined(_PTRDIFF_T) || __has_feature(modules) 31249423Sdim/* Always define ptrdiff_t when modules are available. */ 32249423Sdim#if !__has_feature(modules) 33221345Sdim#define _PTRDIFF_T 34221345Sdim#endif 35249423Sdimtypedef __PTRDIFF_TYPE__ ptrdiff_t; 36249423Sdim#endif 37276479Sdim#undef __need_ptrdiff_t 38276479Sdim#endif /* defined(__need_ptrdiff_t) */ 39249423Sdim 40276479Sdim#if defined(__need_size_t) 41249423Sdim#if !defined(_SIZE_T) || __has_feature(modules) 42249423Sdim/* Always define size_t when modules are available. */ 43249423Sdim#if !__has_feature(modules) 44204962Srdivacky#define _SIZE_T 45204962Srdivacky#endif 46249423Sdimtypedef __SIZE_TYPE__ size_t; 47249423Sdim#endif 48276479Sdim#undef __need_size_t 49276479Sdim#endif /*defined(__need_size_t) */ 50249423Sdim 51280031Sdim#if defined(__need_STDDEF_H_misc) 52251662Sdim/* ISO9899:2011 7.20 (C11 Annex K): Define rsize_t if __STDC_WANT_LIB_EXT1__ is 53251662Sdim * enabled. */ 54251662Sdim#if (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 && \ 55251662Sdim !defined(_RSIZE_T)) || __has_feature(modules) 56251662Sdim/* Always define rsize_t when modules are available. */ 57251662Sdim#if !__has_feature(modules) 58251662Sdim#define _RSIZE_T 59251662Sdim#endif 60251662Sdimtypedef __SIZE_TYPE__ rsize_t; 61251662Sdim#endif 62280031Sdim#endif /* defined(__need_STDDEF_H_misc) */ 63251662Sdim 64276479Sdim#if defined(__need_wchar_t) 65193326Sed#ifndef __cplusplus 66249423Sdim/* Always define wchar_t when modules are available. */ 67249423Sdim#if !defined(_WCHAR_T) || __has_feature(modules) 68249423Sdim#if !__has_feature(modules) 69204962Srdivacky#define _WCHAR_T 70251662Sdim#if defined(_MSC_EXTENSIONS) 71251662Sdim#define _WCHAR_T_DEFINED 72249423Sdim#endif 73251662Sdim#endif 74212904Sdimtypedef __WCHAR_TYPE__ wchar_t; 75193326Sed#endif 76204962Srdivacky#endif 77276479Sdim#undef __need_wchar_t 78276479Sdim#endif /* defined(__need_wchar_t) */ 79193326Sed 80276479Sdim#if defined(__need_NULL) 81204962Srdivacky#undef NULL 82193326Sed#ifdef __cplusplus 83239462Sdim# if !defined(__MINGW32__) && !defined(_MSC_VER) 84239462Sdim# define NULL __null 85239462Sdim# else 86239462Sdim# define NULL 0 87239462Sdim# endif 88193326Sed#else 89239462Sdim# define NULL ((void*)0) 90193326Sed#endif 91239462Sdim#ifdef __cplusplus 92239462Sdim#if defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED) 93239462Sdimnamespace std { typedef decltype(nullptr) nullptr_t; } 94239462Sdimusing ::std::nullptr_t; 95239462Sdim#endif 96239462Sdim#endif 97276479Sdim#undef __need_NULL 98276479Sdim#endif /* defined(__need_NULL) */ 99239462Sdim 100280031Sdim#if defined(__need_STDDEF_H_misc) 101276479Sdim#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L 102280031Sdim#include "__stddef_max_align_t.h" 103276479Sdim#endif 104193326Sed#define offsetof(t, d) __builtin_offsetof(t, d) 105280031Sdim#undef __need_STDDEF_H_misc 106280031Sdim#endif /* defined(__need_STDDEF_H_misc) */ 107193326Sed 108218893Sdim/* Some C libraries expect to see a wint_t here. Others (notably MinGW) will use 109221345Sdim__WINT_TYPE__ directly; accommodate both by requiring __need_wint_t */ 110218893Sdim#if defined(__need_wint_t) 111249423Sdim/* Always define wint_t when modules are available. */ 112249423Sdim#if !defined(_WINT_T) || __has_feature(modules) 113249423Sdim#if !__has_feature(modules) 114218893Sdim#define _WINT_T 115249423Sdim#endif 116218893Sdimtypedef __WINT_TYPE__ wint_t; 117249423Sdim#endif 118218893Sdim#undef __need_wint_t 119218893Sdim#endif /* __need_wint_t */ 120276479Sdim 121276479Sdim#endif 122