xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Headers/stddef.h (revision 7330f729ccf0bd976a06f95fad452fe774fc7fd1)
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