1*820c1a8dSHiroo HAYASHI /* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues. 2*820c1a8dSHiroo HAYASHI 3*820c1a8dSHiroo HAYASHI Copyright (C) 2009-2021 Free Software Foundation, Inc. 4*820c1a8dSHiroo HAYASHI 5*820c1a8dSHiroo HAYASHI This file is free software: you can redistribute it and/or modify 6*820c1a8dSHiroo HAYASHI it under the terms of the GNU Lesser General Public License as 7*820c1a8dSHiroo HAYASHI published by the Free Software Foundation; either version 2.1 of the 8*820c1a8dSHiroo HAYASHI License, or (at your option) any later version. 9*820c1a8dSHiroo HAYASHI 10*820c1a8dSHiroo HAYASHI This file is distributed in the hope that it will be useful, 11*820c1a8dSHiroo HAYASHI but WITHOUT ANY WARRANTY; without even the implied warranty of 12*820c1a8dSHiroo HAYASHI MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*820c1a8dSHiroo HAYASHI GNU Lesser General Public License for more details. 14*820c1a8dSHiroo HAYASHI 15*820c1a8dSHiroo HAYASHI You should have received a copy of the GNU Lesser General Public License 16*820c1a8dSHiroo HAYASHI along with this program. If not, see <https://www.gnu.org/licenses/>. */ 17*820c1a8dSHiroo HAYASHI 18*820c1a8dSHiroo HAYASHI /* Written by Eric Blake. */ 19*820c1a8dSHiroo HAYASHI 20*820c1a8dSHiroo HAYASHI /* 21*820c1a8dSHiroo HAYASHI * POSIX 2008 <stddef.h> for platforms that have issues. 22*820c1a8dSHiroo HAYASHI * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stddef.h.html> 23*820c1a8dSHiroo HAYASHI */ 24*820c1a8dSHiroo HAYASHI 25*820c1a8dSHiroo HAYASHI #if __GNUC__ >= 3 26*820c1a8dSHiroo HAYASHI @PRAGMA_SYSTEM_HEADER@ 27*820c1a8dSHiroo HAYASHI #endif 28*820c1a8dSHiroo HAYASHI @PRAGMA_COLUMNS@ 29*820c1a8dSHiroo HAYASHI 30*820c1a8dSHiroo HAYASHI #if defined __need_wchar_t || defined __need_size_t \ 31*820c1a8dSHiroo HAYASHI || defined __need_ptrdiff_t || defined __need_NULL \ 32*820c1a8dSHiroo HAYASHI || defined __need_wint_t 33*820c1a8dSHiroo HAYASHI /* Special invocation convention inside gcc header files. In 34*820c1a8dSHiroo HAYASHI particular, gcc provides a version of <stddef.h> that blindly 35*820c1a8dSHiroo HAYASHI redefines NULL even when __need_wint_t was defined, even though 36*820c1a8dSHiroo HAYASHI wint_t is not normally provided by <stddef.h>. Hence, we must 37*820c1a8dSHiroo HAYASHI remember if special invocation has ever been used to obtain wint_t, 38*820c1a8dSHiroo HAYASHI in which case we need to clean up NULL yet again. */ 39*820c1a8dSHiroo HAYASHI 40*820c1a8dSHiroo HAYASHI # if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T) 41*820c1a8dSHiroo HAYASHI # ifdef __need_wint_t 42*820c1a8dSHiroo HAYASHI # define _GL_STDDEF_WINT_T 43*820c1a8dSHiroo HAYASHI # endif 44*820c1a8dSHiroo HAYASHI # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ 45*820c1a8dSHiroo HAYASHI /* On TinyCC, make sure that the macros that indicate the special invocation 46*820c1a8dSHiroo HAYASHI convention get undefined. */ 47*820c1a8dSHiroo HAYASHI # undef __need_wchar_t 48*820c1a8dSHiroo HAYASHI # undef __need_size_t 49*820c1a8dSHiroo HAYASHI # undef __need_ptrdiff_t 50*820c1a8dSHiroo HAYASHI # undef __need_NULL 51*820c1a8dSHiroo HAYASHI # undef __need_wint_t 52*820c1a8dSHiroo HAYASHI # endif 53*820c1a8dSHiroo HAYASHI 54*820c1a8dSHiroo HAYASHI #else 55*820c1a8dSHiroo HAYASHI /* Normal invocation convention. */ 56*820c1a8dSHiroo HAYASHI 57*820c1a8dSHiroo HAYASHI # ifndef _@GUARD_PREFIX@_STDDEF_H 58*820c1a8dSHiroo HAYASHI 59*820c1a8dSHiroo HAYASHI /* On AIX 7.2, with xlc in 64-bit mode, <stddef.h> defines max_align_t to a 60*820c1a8dSHiroo HAYASHI type with alignment 4, but 'long' has alignment 8. */ 61*820c1a8dSHiroo HAYASHI # if defined _AIX && defined __LP64__ 62*820c1a8dSHiroo HAYASHI # if !GNULIB_defined_max_align_t 63*820c1a8dSHiroo HAYASHI # ifdef _MAX_ALIGN_T 64*820c1a8dSHiroo HAYASHI /* /usr/include/stddef.h has already defined max_align_t. Override it. */ 65*820c1a8dSHiroo HAYASHI typedef long rpl_max_align_t; 66*820c1a8dSHiroo HAYASHI # define max_align_t rpl_max_align_t 67*820c1a8dSHiroo HAYASHI # else 68*820c1a8dSHiroo HAYASHI /* Prevent /usr/include/stddef.h from defining max_align_t. */ 69*820c1a8dSHiroo HAYASHI typedef long max_align_t; 70*820c1a8dSHiroo HAYASHI # define _MAX_ALIGN_T 71*820c1a8dSHiroo HAYASHI # endif 72*820c1a8dSHiroo HAYASHI # define GNULIB_defined_max_align_t 1 73*820c1a8dSHiroo HAYASHI # endif 74*820c1a8dSHiroo HAYASHI # endif 75*820c1a8dSHiroo HAYASHI 76*820c1a8dSHiroo HAYASHI /* The include_next requires a split double-inclusion guard. */ 77*820c1a8dSHiroo HAYASHI 78*820c1a8dSHiroo HAYASHI # @INCLUDE_NEXT@ @NEXT_STDDEF_H@ 79*820c1a8dSHiroo HAYASHI 80*820c1a8dSHiroo HAYASHI /* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */ 81*820c1a8dSHiroo HAYASHI # if (@REPLACE_NULL@ \ 82*820c1a8dSHiroo HAYASHI && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T)) 83*820c1a8dSHiroo HAYASHI # undef NULL 84*820c1a8dSHiroo HAYASHI # ifdef __cplusplus 85*820c1a8dSHiroo HAYASHI /* ISO C++ says that the macro NULL must expand to an integer constant 86*820c1a8dSHiroo HAYASHI expression, hence '((void *) 0)' is not allowed in C++. */ 87*820c1a8dSHiroo HAYASHI # if __GNUG__ >= 3 88*820c1a8dSHiroo HAYASHI /* GNU C++ has a __null macro that behaves like an integer ('int' or 89*820c1a8dSHiroo HAYASHI 'long') but has the same size as a pointer. Use that, to avoid 90*820c1a8dSHiroo HAYASHI warnings. */ 91*820c1a8dSHiroo HAYASHI # define NULL __null 92*820c1a8dSHiroo HAYASHI # else 93*820c1a8dSHiroo HAYASHI # define NULL 0L 94*820c1a8dSHiroo HAYASHI # endif 95*820c1a8dSHiroo HAYASHI # else 96*820c1a8dSHiroo HAYASHI # define NULL ((void *) 0) 97*820c1a8dSHiroo HAYASHI # endif 98*820c1a8dSHiroo HAYASHI # endif 99*820c1a8dSHiroo HAYASHI 100*820c1a8dSHiroo HAYASHI # ifndef _@GUARD_PREFIX@_STDDEF_H 101*820c1a8dSHiroo HAYASHI # define _@GUARD_PREFIX@_STDDEF_H 102*820c1a8dSHiroo HAYASHI 103*820c1a8dSHiroo HAYASHI /* Some platforms lack wchar_t. */ 104*820c1a8dSHiroo HAYASHI #if !@HAVE_WCHAR_T@ 105*820c1a8dSHiroo HAYASHI # define wchar_t int 106*820c1a8dSHiroo HAYASHI #endif 107*820c1a8dSHiroo HAYASHI 108*820c1a8dSHiroo HAYASHI /* Some platforms lack max_align_t. The check for _GCC_MAX_ALIGN_T is 109*820c1a8dSHiroo HAYASHI a hack in case the configure-time test was done with g++ even though 110*820c1a8dSHiroo HAYASHI we are currently compiling with gcc. 111*820c1a8dSHiroo HAYASHI On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was 112*820c1a8dSHiroo HAYASHI included. Its definition is good since it has an alignment of 8 (on x86 113*820c1a8dSHiroo HAYASHI and x86_64). 114*820c1a8dSHiroo HAYASHI Similarly on OS/2 kLIBC. */ 115*820c1a8dSHiroo HAYASHI #if (defined _MSC_VER || (defined __KLIBC__ && !defined __LIBCN__)) \ 116*820c1a8dSHiroo HAYASHI && defined __cplusplus 117*820c1a8dSHiroo HAYASHI # include <cstddef> 118*820c1a8dSHiroo HAYASHI #else 119*820c1a8dSHiroo HAYASHI # if ! (@HAVE_MAX_ALIGN_T@ || (defined _GCC_MAX_ALIGN_T && !defined __clang__)) 120*820c1a8dSHiroo HAYASHI # if !GNULIB_defined_max_align_t 121*820c1a8dSHiroo HAYASHI /* On the x86, the maximum storage alignment of double, long, etc. is 4, 122*820c1a8dSHiroo HAYASHI but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8, 123*820c1a8dSHiroo HAYASHI and the C11 standard allows this. Work around this problem by 124*820c1a8dSHiroo HAYASHI using __alignof__ (which returns 8 for double) rather than _Alignof 125*820c1a8dSHiroo HAYASHI (which returns 4), and align each union member accordingly. */ 126*820c1a8dSHiroo HAYASHI # if defined __GNUC__ || (__clang_major__ >= 4) 127*820c1a8dSHiroo HAYASHI # define _GL_STDDEF_ALIGNAS(type) \ 128*820c1a8dSHiroo HAYASHI __attribute__ ((__aligned__ (__alignof__ (type)))) 129*820c1a8dSHiroo HAYASHI # else 130*820c1a8dSHiroo HAYASHI # define _GL_STDDEF_ALIGNAS(type) /* */ 131*820c1a8dSHiroo HAYASHI # endif 132*820c1a8dSHiroo HAYASHI typedef union 133*820c1a8dSHiroo HAYASHI { 134*820c1a8dSHiroo HAYASHI char *__p _GL_STDDEF_ALIGNAS (char *); 135*820c1a8dSHiroo HAYASHI double __d _GL_STDDEF_ALIGNAS (double); 136*820c1a8dSHiroo HAYASHI long double __ld _GL_STDDEF_ALIGNAS (long double); 137*820c1a8dSHiroo HAYASHI long int __i _GL_STDDEF_ALIGNAS (long int); 138*820c1a8dSHiroo HAYASHI } rpl_max_align_t; 139*820c1a8dSHiroo HAYASHI # define max_align_t rpl_max_align_t 140*820c1a8dSHiroo HAYASHI # define GNULIB_defined_max_align_t 1 141*820c1a8dSHiroo HAYASHI # endif 142*820c1a8dSHiroo HAYASHI # endif 143*820c1a8dSHiroo HAYASHI #endif 144*820c1a8dSHiroo HAYASHI 145*820c1a8dSHiroo HAYASHI # endif /* _@GUARD_PREFIX@_STDDEF_H */ 146*820c1a8dSHiroo HAYASHI # endif /* _@GUARD_PREFIX@_STDDEF_H */ 147*820c1a8dSHiroo HAYASHI #endif /* __need_XXX */ 148