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