Blame lib/stddef.in.h

Packit 33f14e
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
Packit 33f14e
Packit 33f14e
   Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit 33f14e
Packit 33f14e
   This program is free software; you can redistribute it and/or modify
Packit 33f14e
   it under the terms of the GNU General Public License as published by
Packit 33f14e
   the Free Software Foundation; either version 3, or (at your option)
Packit 33f14e
   any later version.
Packit 33f14e
Packit 33f14e
   This program is distributed in the hope that it will be useful,
Packit 33f14e
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 33f14e
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 33f14e
   GNU General Public License for more details.
Packit 33f14e
Packit 33f14e
   You should have received a copy of the GNU General Public License
Packit 33f14e
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit 33f14e
Packit 33f14e
/* Written by Eric Blake.  */
Packit 33f14e
Packit 33f14e
/*
Packit 33f14e
 * POSIX 2008 <stddef.h> for platforms that have issues.
Packit 33f14e
 * <http://www.opengroup.org/susv3xbd/stddef.h.html>
Packit 33f14e
 */
Packit 33f14e
Packit 33f14e
#if __GNUC__ >= 3
Packit 33f14e
@PRAGMA_SYSTEM_HEADER@
Packit 33f14e
#endif
Packit 33f14e
@PRAGMA_COLUMNS@
Packit 33f14e
Packit 33f14e
#if defined __need_wchar_t || defined __need_size_t  \
Packit 33f14e
  || defined __need_ptrdiff_t || defined __need_NULL \
Packit 33f14e
  || defined __need_wint_t
Packit 33f14e
/* Special invocation convention inside gcc header files.  In
Packit 33f14e
   particular, gcc provides a version of <stddef.h> that blindly
Packit 33f14e
   redefines NULL even when __need_wint_t was defined, even though
Packit 33f14e
   wint_t is not normally provided by <stddef.h>.  Hence, we must
Packit 33f14e
   remember if special invocation has ever been used to obtain wint_t,
Packit 33f14e
   in which case we need to clean up NULL yet again.  */
Packit 33f14e
Packit 33f14e
# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
Packit 33f14e
#  ifdef __need_wint_t
Packit 33f14e
#   define _GL_STDDEF_WINT_T
Packit 33f14e
#  endif
Packit 33f14e
#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
Packit 33f14e
# endif
Packit 33f14e
Packit 33f14e
#else
Packit 33f14e
/* Normal invocation convention.  */
Packit 33f14e
Packit 33f14e
# ifndef _@GUARD_PREFIX@_STDDEF_H
Packit 33f14e
Packit 33f14e
/* The include_next requires a split double-inclusion guard.  */
Packit 33f14e
Packit 33f14e
#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
Packit 33f14e
Packit 33f14e
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses.  */
Packit 33f14e
#  if (@REPLACE_NULL@ \
Packit 33f14e
       && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
Packit 33f14e
#   undef NULL
Packit 33f14e
#   ifdef __cplusplus
Packit 33f14e
   /* ISO C++ says that the macro NULL must expand to an integer constant
Packit 33f14e
      expression, hence '((void *) 0)' is not allowed in C++.  */
Packit 33f14e
#    if __GNUG__ >= 3
Packit 33f14e
    /* GNU C++ has a __null macro that behaves like an integer ('int' or
Packit 33f14e
       'long') but has the same size as a pointer.  Use that, to avoid
Packit 33f14e
       warnings.  */
Packit 33f14e
#     define NULL __null
Packit 33f14e
#    else
Packit 33f14e
#     define NULL 0L
Packit 33f14e
#    endif
Packit 33f14e
#   else
Packit 33f14e
#    define NULL ((void *) 0)
Packit 33f14e
#   endif
Packit 33f14e
#  endif
Packit 33f14e
Packit 33f14e
#  ifndef _@GUARD_PREFIX@_STDDEF_H
Packit 33f14e
#   define _@GUARD_PREFIX@_STDDEF_H
Packit 33f14e
Packit 33f14e
/* Some platforms lack wchar_t.  */
Packit 33f14e
#if !@HAVE_WCHAR_T@
Packit 33f14e
# define wchar_t int
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
/* Some platforms lack max_align_t.  The check for _GCC_MAX_ALIGN_T is
Packit 33f14e
   a hack in case the configure-time test was done with g++ even though
Packit 33f14e
   we are currently compiling with gcc.  */
Packit 33f14e
#if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
Packit 33f14e
/* On the x86, the maximum storage alignment of double, long, etc. is 4,
Packit 33f14e
   but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
Packit 33f14e
   and the C11 standard allows this.  Work around this problem by
Packit 33f14e
   using __alignof__ (which returns 8 for double) rather than _Alignof
Packit 33f14e
   (which returns 4), and align each union member accordingly.  */
Packit 33f14e
# ifdef __GNUC__
Packit 33f14e
#  define _GL_STDDEF_ALIGNAS(type) \
Packit 33f14e
     __attribute__ ((__aligned__ (__alignof__ (type))))
Packit 33f14e
# else
Packit 33f14e
#  define _GL_STDDEF_ALIGNAS(type) /* */
Packit 33f14e
# endif
Packit 33f14e
typedef union
Packit 33f14e
{
Packit 33f14e
  char *__p _GL_STDDEF_ALIGNAS (char *);
Packit 33f14e
  double __d _GL_STDDEF_ALIGNAS (double);
Packit 33f14e
  long double __ld _GL_STDDEF_ALIGNAS (long double);
Packit 33f14e
  long int __i _GL_STDDEF_ALIGNAS (long int);
Packit 33f14e
} max_align_t;
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
#  endif /* _@GUARD_PREFIX@_STDDEF_H */
Packit 33f14e
# endif /* _@GUARD_PREFIX@_STDDEF_H */
Packit 33f14e
#endif /* __need_XXX */