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