]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - misc/sys/cdefs.h
Update.
[thirdparty/glibc.git] / misc / sys / cdefs.h
index 539cbbc09f2373cb8b6d5d4f435b3565e525de19..3174a8524c7124e468039cbfa566476f37ca981b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
+/* Copyright (C) 1992,93,94,95,96,97,98,99, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 #ifndef        _SYS_CDEFS_H
 #define        _SYS_CDEFS_H    1
 
-#include <features.h>
+/* We are almost always included from features.h. */
+#ifndef _FEATURES_H
+# include <features.h>
+#endif
+
+/* The GNU libc does not support any K&R compilers or the traditional mode
+   of ISO C compilers anymore.  Check for some of the combinations not
+   anymore supported.  */
+#if defined __GNUC__ && !defined __STDC__
+# error "You need a ISO C conforming compiler to use the glibc headers"
+#endif
 
 /* Some user header file might have defined this before.  */
 #undef __P
+#undef __PMT
 
 #ifdef __GNUC__
 
 /* GCC can always grok prototypes.  For C++ programs we add throw()
    to help it optimize the function calls.  But this works only with
    gcc 2.8.x and egcs.  */
-# if defined __cplusplus && __GNUC_MINOR__ >= 8
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
 #  define __THROW      throw ()
 # else
 #  define __THROW
 /* This macro will be used for functions which might take C++ callback
    functions.  */
 # define __PMT(args)   args
-# define __DOTS                , ...
 
 #else  /* Not GCC.  */
 
 # define __inline              /* No inline functions.  */
 
-# if (defined __STDC__ && __STDC__) || defined __cplusplus
-
-#  define __P(args)    args
-#  define __PMT(args)  args
-#  define __const      const
-#  define __signed     signed
-#  define __volatile   volatile
-#  define __DOTS       , ...
-
-# else /* Not ANSI C or C++.  */
-
-#  define __P(args)    ()      /* No prototypes.  */
-#  define __PMT(args)  ()
-#  define __const              /* No ANSI C keywords.  */
-#  define __signed
-#  define __volatile
-#  define __DOTS
+# define __THROW
+# define __P(args)     args
+# define __PMT(args)   args
 
-# endif        /* ANSI C or C++.  */
+# define __const       const
+# define __signed      signed
+# define __volatile    volatile
 
 #endif /* GCC.  */
 
 /* For these things, GCC behaves the ANSI way normally,
    and the non-ANSI way under -traditional.  */
 
-#if defined __STDC__ && __STDC__
-
-# define __CONCAT(x,y) x ## y
-# define __STRING(x)   #x
+#define __CONCAT(x,y)  x ## y
+#define __STRING(x)    #x
 
 /* This is not a typedef so `const __ptr_t' does the right thing.  */
-# define __ptr_t void *
-# define __long_double_t  long double
-
-#else
-
-# define __CONCAT(x,y) x/**/y
-# define __STRING(x)   "x"
-
-# define __ptr_t char *
-# define __long_double_t  long double
-
-/* The BSD header files use the ANSI keywords unmodified (this means that
-   old programs may lose if they use the new keywords as identifiers), but
-   those names are not available under -traditional.  We define them to
-   their __ versions, which are taken care of above.  */
-#ifdef __USE_BSD
-# define const         __const
-# define signed                __signed
-# define volatile      __volatile
-#endif
-
-#endif /* __STDC__ */
+#define __ptr_t void *
+#define __long_double_t  long double
 
 
 /* C++ needs to know that types and declarations are C, not C++.  */
 # define __END_DECLS
 #endif
 
+
+/* Support for bounded pointers.  */
+#ifndef __BOUNDED_POINTERS__
+# define __bounded     /* nothing */
+# define __unbounded   /* nothing */
+# define __ptrvalue    /* nothing */
+#endif
+
+
 /* __asm__ ("xyz") is used throughout the headers to rename functions
    at the assembly language level.  This is wrapped by the __REDIRECT
    macro, in order to support compilers that can do this some other
    semantics, but it's the best we can do).
 
    Example:
-   int __REDIRECT(setpgrp, __P((__pid_t pid, __pid_t pgrp)), setpgid); */
+   int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
 
 #if defined __GNUC__ && __GNUC__ >= 2
 
 /*
 #elif __SOME_OTHER_COMPILER__
 
-# define __attribute__(xyz)
 # define __REDIRECT(name, proto, alias) name proto; \
        _Pragma("let " #name " = " #alias)
 */
    `__attribute__' syntax.  All of the ways we use this do fine if
    they are omitted for compilers that don't understand it. */
 #if !defined __GNUC__ || __GNUC__ < 2
+# define __attribute__(xyz)    /* Ignore */
+#endif
+
+/* At some point during the gcc 2.96 development the `malloc' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,96)
+# define __attribute_malloc__ __attribute__ ((__malloc__))
+#else
+# define __attribute_malloc__ /* Ignore */
+#endif
 
-# define __attribute__(xyz)    /* Ignore. */
+/* At some point during the gcc 2.96 development the `pure' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,96)
+# define __attribute_pure__ __attribute__ ((__pure__))
+#else
+# define __attribute_pure__ /* Ignore */
+#endif
 
+/* At some point during the gcc 2.8 development the `format_arg' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,8)
+# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
+#else
+# define __attribute_format_arg__(x) /* Ignore */
 #endif
 
 /* It is possible to compile containing GCC extensions even if GCC is
    run in pedantic mode if the uses are carefully marked using the
    `__extension__' keyword.  But this is not generally available before
    version 2.8.  */
-#if !defined __GNUC__ || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
-
+#if !__GNUC_PREREQ (2,8)
 # define __extension__         /* Ignore */
+#endif
 
+/* __restrict is known in EGCS 1.2 and above. */
+#if !__GNUC_PREREQ (2,92)
+# define __restrict    /* Ignore */
 #endif
 
-/* No current version of gcc knows the `restrict' keyword.  Define it
-   for now unconditionally to the empty string.  */
-#define __restrict
+/* ISO C99 also allows to declare arrays as non-overlapping.  The syntax is
+     array_name[restrict]
+   But gcc so far does not support this syntax.  We define a separate macro
+   for this which can be enabled if the underlying compiler supports it.  */
+#define __restrict_arr
 
 #endif  /* sys/cdefs.h */