xref: /openbsd/gnu/llvm/clang/lib/Headers/stddef.h (revision 12c85518)
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