|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* ANSI and traditional C compatability macros
|
|
|
|
Copyright (C) 1991-2015 Free Software Foundation, Inc. |
|
|
|
/* Compiler compatibility macros
|
|
|
|
Copyright (C) 1991-2024 Free Software Foundation, Inc. |
|
|
|
This file is part of the GNU C Library. |
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify |
|
|
|
@ -16,18 +16,7 @@ You should have received a copy of the GNU General Public License |
|
|
|
along with this program; if not, write to the Free Software |
|
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
|
|
|
|
|
|
|
/* ANSI and traditional C compatibility macros
|
|
|
|
|
|
|
|
ANSI C is assumed if __STDC__ is #defined. |
|
|
|
|
|
|
|
Macro ANSI C definition Traditional C definition |
|
|
|
----- ---- - ---------- ----------- - ---------- |
|
|
|
PTR `void *' `char *' |
|
|
|
const not defined `' |
|
|
|
volatile not defined `' |
|
|
|
signed not defined `' |
|
|
|
|
|
|
|
For ease of writing code which uses GCC extensions but needs to be |
|
|
|
/* For ease of writing code which uses GCC extensions but needs to be
|
|
|
|
portable to other compilers, we provide the GCC_VERSION macro that |
|
|
|
simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various |
|
|
|
wrappers around __attribute__. Also, __extension__ will be #defined |
|
|
|
@ -62,24 +51,10 @@ So instead we use the macro below and test it against specific values. */ |
|
|
|
#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) |
|
|
|
#endif /* GCC_VERSION */ |
|
|
|
|
|
|
|
#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) |
|
|
|
/* All known AIX compilers implement these things (but don't always
|
|
|
|
define __STDC__). The RISC/OS MIPS compiler defines these things |
|
|
|
in SVR4 mode, but does not define __STDC__. */ |
|
|
|
/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other
|
|
|
|
C++ compilers, does not define __STDC__, though it acts as if this |
|
|
|
was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ |
|
|
|
|
|
|
|
#define PTR void * |
|
|
|
|
|
|
|
#undef const |
|
|
|
#undef volatile |
|
|
|
#undef signed |
|
|
|
|
|
|
|
/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
|
|
|
|
it too, but it's not in C89. */ |
|
|
|
#undef inline |
|
|
|
#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__)) |
|
|
|
#if (!defined(__cplusplus) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__)) |
|
|
|
/* it's a keyword */ |
|
|
|
#else |
|
|
|
# if GCC_VERSION >= 2007 |
|
|
|
@ -89,22 +64,6 @@ So instead we use the macro below and test it against specific values. */ |
|
|
|
# endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#else /* Not ANSI C. */ |
|
|
|
|
|
|
|
#define PTR char * |
|
|
|
|
|
|
|
/* some systems define these in header files for non-ansi mode */ |
|
|
|
#undef const |
|
|
|
#undef volatile |
|
|
|
#undef signed |
|
|
|
#undef inline |
|
|
|
#define const |
|
|
|
#define volatile |
|
|
|
#define signed |
|
|
|
#define inline |
|
|
|
|
|
|
|
#endif /* ANSI C. */ |
|
|
|
|
|
|
|
/* Define macros for some gcc attributes. This permits us to use the
|
|
|
|
macros freely, and know that they will come into play for the |
|
|
|
version of gcc in which they are supported. */ |
|
|
|
@ -252,7 +211,7 @@ So instead we use the macro below and test it against specific values. */ |
|
|
|
# endif /* GNUC >= 3.0 */ |
|
|
|
#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */ |
|
|
|
|
|
|
|
/* Useful for structures whose layout must much some binary specification
|
|
|
|
/* Useful for structures whose layout must match some binary specification
|
|
|
|
regardless of the alignment and padding qualities of the compiler. */ |
|
|
|
#ifndef ATTRIBUTE_PACKED |
|
|
|
# define ATTRIBUTE_PACKED __attribute__ ((packed)) |
|
|
|
@ -283,6 +242,49 @@ So instead we use the macro below and test it against specific values. */ |
|
|
|
# endif /* GNUC >= 4.9 */ |
|
|
|
#endif /* ATTRIBUTE_NO_SANITIZE_UNDEFINED */ |
|
|
|
|
|
|
|
/* Attribute 'nonstring' was valid as of gcc 8. */ |
|
|
|
#ifndef ATTRIBUTE_NONSTRING |
|
|
|
# if GCC_VERSION >= 8000 |
|
|
|
# define ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__)) |
|
|
|
# else |
|
|
|
# define ATTRIBUTE_NONSTRING |
|
|
|
# endif |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Attribute `alloc_size' was valid as of gcc 4.3. */ |
|
|
|
#ifndef ATTRIBUTE_RESULT_SIZE_1 |
|
|
|
# if (GCC_VERSION >= 4003) |
|
|
|
# define ATTRIBUTE_RESULT_SIZE_1 __attribute__ ((alloc_size (1))) |
|
|
|
# else |
|
|
|
# define ATTRIBUTE_RESULT_SIZE_1 |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef ATTRIBUTE_RESULT_SIZE_2 |
|
|
|
# if (GCC_VERSION >= 4003) |
|
|
|
# define ATTRIBUTE_RESULT_SIZE_2 __attribute__ ((alloc_size (2))) |
|
|
|
# else |
|
|
|
# define ATTRIBUTE_RESULT_SIZE_2 |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifndef ATTRIBUTE_RESULT_SIZE_1_2 |
|
|
|
# if (GCC_VERSION >= 4003) |
|
|
|
# define ATTRIBUTE_RESULT_SIZE_1_2 __attribute__ ((alloc_size (1, 2))) |
|
|
|
# else |
|
|
|
# define ATTRIBUTE_RESULT_SIZE_1_2 |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Attribute `warn_unused_result' was valid as of gcc 3.3. */ |
|
|
|
#ifndef ATTRIBUTE_WARN_UNUSED_RESULT |
|
|
|
# if GCC_VERSION >= 3003 |
|
|
|
# define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) |
|
|
|
# else |
|
|
|
# define ATTRIBUTE_WARN_UNUSED_RESULT |
|
|
|
# endif |
|
|
|
#endif |
|
|
|
|
|
|
|
/* We use __extension__ in some places to suppress -pedantic warnings
|
|
|
|
about GCC extensions. This feature didn't work properly before |
|
|
|
gcc 2.8. */ |
|
|
|
@ -313,15 +315,38 @@ So instead we use the macro below and test it against specific values. */ |
|
|
|
#define ENUM_BITFIELD(TYPE) unsigned int |
|
|
|
#endif |
|
|
|
|
|
|
|
/* This is used to mark a class or virtual function as final. */ |
|
|
|
#if __cplusplus >= 201103L |
|
|
|
#define GCC_FINAL final |
|
|
|
#elif GCC_VERSION >= 4007 |
|
|
|
#define GCC_FINAL __final |
|
|
|
#if defined(__cplusplus) && __cpp_constexpr >= 200704 |
|
|
|
#define CONSTEXPR constexpr |
|
|
|
#else |
|
|
|
#define GCC_FINAL |
|
|
|
#define CONSTEXPR |
|
|
|
#endif |
|
|
|
|
|
|
|
/* A macro to disable the copy constructor and assignment operator.
|
|
|
|
When building with C++11 and above, the methods are explicitly |
|
|
|
deleted, causing a compile-time error if something tries to copy. |
|
|
|
For C++03, this just declares the methods, causing a link-time |
|
|
|
error if the methods end up called (assuming you don't |
|
|
|
define them). For C++03, for best results, place the macro |
|
|
|
under the private: access specifier, like this, |
|
|
|
|
|
|
|
class name_lookup |
|
|
|
{ |
|
|
|
private: |
|
|
|
DISABLE_COPY_AND_ASSIGN (name_lookup); |
|
|
|
}; |
|
|
|
|
|
|
|
so that most attempts at copy are caught at compile-time. */ |
|
|
|
|
|
|
|
#if defined(__cplusplus) && __cplusplus >= 201103 |
|
|
|
#define DISABLE_COPY_AND_ASSIGN(TYPE) \ |
|
|
|
TYPE (const TYPE&) = delete; \ |
|
|
|
void operator= (const TYPE &) = delete |
|
|
|
#else |
|
|
|
#define DISABLE_COPY_AND_ASSIGN(TYPE) \ |
|
|
|
TYPE (const TYPE&); \ |
|
|
|
void operator= (const TYPE &) |
|
|
|
#endif /* __cplusplus >= 201103 */ |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
} |
|
|
|
#endif |
|
|
|
|