diff options
Diffstat (limited to 'build-aux/snippet/c++defs.h')
| -rw-r--r-- | build-aux/snippet/c++defs.h | 271 | 
1 files changed, 271 insertions, 0 deletions
diff --git a/build-aux/snippet/c++defs.h b/build-aux/snippet/c++defs.h new file mode 100644 index 00000000..585b38ab --- /dev/null +++ b/build-aux/snippet/c++defs.h @@ -0,0 +1,271 @@ +/* C++ compatible function declaration macros. +   Copyright (C) 2010-2015 Free Software Foundation, Inc. + +   This program is free software: you can redistribute it and/or modify it +   under the terms of the GNU General Public License as published +   by the Free Software Foundation; either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   General Public License for more details. + +   You should have received a copy of the GNU General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ + +#ifndef _GL_CXXDEFS_H +#define _GL_CXXDEFS_H + +/* The three most frequent use cases of these macros are: + +   * For providing a substitute for a function that is missing on some +     platforms, but is declared and works fine on the platforms on which +     it exists: + +       #if @GNULIB_FOO@ +       # if !@HAVE_FOO@ +       _GL_FUNCDECL_SYS (foo, ...); +       # endif +       _GL_CXXALIAS_SYS (foo, ...); +       _GL_CXXALIASWARN (foo); +       #elif defined GNULIB_POSIXCHECK +       ... +       #endif + +   * For providing a replacement for a function that exists on all platforms, +     but is broken/insufficient and needs to be replaced on some platforms: + +       #if @GNULIB_FOO@ +       # if @REPLACE_FOO@ +       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +       #   undef foo +       #   define foo rpl_foo +       #  endif +       _GL_FUNCDECL_RPL (foo, ...); +       _GL_CXXALIAS_RPL (foo, ...); +       # else +       _GL_CXXALIAS_SYS (foo, ...); +       # endif +       _GL_CXXALIASWARN (foo); +       #elif defined GNULIB_POSIXCHECK +       ... +       #endif + +   * For providing a replacement for a function that exists on some platforms +     but is broken/insufficient and needs to be replaced on some of them and +     is additionally either missing or undeclared on some other platforms: + +       #if @GNULIB_FOO@ +       # if @REPLACE_FOO@ +       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +       #   undef foo +       #   define foo rpl_foo +       #  endif +       _GL_FUNCDECL_RPL (foo, ...); +       _GL_CXXALIAS_RPL (foo, ...); +       # else +       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@ +       _GL_FUNCDECL_SYS (foo, ...); +       #  endif +       _GL_CXXALIAS_SYS (foo, ...); +       # endif +       _GL_CXXALIASWARN (foo); +       #elif defined GNULIB_POSIXCHECK +       ... +       #endif +*/ + +/* _GL_EXTERN_C declaration; +   performs the declaration with C linkage.  */ +#if defined __cplusplus +# define _GL_EXTERN_C extern "C" +#else +# define _GL_EXTERN_C extern +#endif + +/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); +   declares a replacement function, named rpl_func, with the given prototype, +   consisting of return type, parameters, and attributes. +   Example: +     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) +                                  _GL_ARG_NONNULL ((1))); + */ +#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ +  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) +#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ +  _GL_EXTERN_C rettype rpl_func parameters_and_attributes + +/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); +   declares the system function, named func, with the given prototype, +   consisting of return type, parameters, and attributes. +   Example: +     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) +                                  _GL_ARG_NONNULL ((1))); + */ +#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ +  _GL_EXTERN_C rettype func parameters_and_attributes + +/* _GL_CXXALIAS_RPL (func, rettype, parameters); +   declares a C++ alias called GNULIB_NAMESPACE::func +   that redirects to rpl_func, if GNULIB_NAMESPACE is defined. +   Example: +     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); + */ +#define _GL_CXXALIAS_RPL(func,rettype,parameters) \ +  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) +#if defined __cplusplus && defined GNULIB_NAMESPACE +# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ +    namespace GNULIB_NAMESPACE                                \ +    {                                                         \ +      rettype (*const func) parameters = ::rpl_func;          \ +    }                                                         \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#else +# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); +   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); +   except that the C function rpl_func may have a slightly different +   declaration.  A cast is used to silence the "invalid conversion" error +   that would otherwise occur.  */ +#if defined __cplusplus && defined GNULIB_NAMESPACE +# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ +    namespace GNULIB_NAMESPACE                                     \ +    {                                                              \ +      rettype (*const func) parameters =                           \ +        reinterpret_cast<rettype(*)parameters>(::rpl_func);        \ +    }                                                              \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#else +# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +/* _GL_CXXALIAS_SYS (func, rettype, parameters); +   declares a C++ alias called GNULIB_NAMESPACE::func +   that redirects to the system provided function func, if GNULIB_NAMESPACE +   is defined. +   Example: +     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); + */ +#if defined __cplusplus && defined GNULIB_NAMESPACE +  /* If we were to write +       rettype (*const func) parameters = ::func; +     like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls +     better (remove an indirection through a 'static' pointer variable), +     but then the _GL_CXXALIASWARN macro below would cause a warning not only +     for uses of ::func but also for uses of GNULIB_NAMESPACE::func.  */ +# define _GL_CXXALIAS_SYS(func,rettype,parameters) \ +    namespace GNULIB_NAMESPACE                     \ +    {                                              \ +      static rettype (*func) parameters = ::func;  \ +    }                                              \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#else +# define _GL_CXXALIAS_SYS(func,rettype,parameters) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); +   is like  _GL_CXXALIAS_SYS (func, rettype, parameters); +   except that the C function func may have a slightly different declaration. +   A cast is used to silence the "invalid conversion" error that would +   otherwise occur.  */ +#if defined __cplusplus && defined GNULIB_NAMESPACE +# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ +    namespace GNULIB_NAMESPACE                          \ +    {                                                   \ +      static rettype (*func) parameters =               \ +        reinterpret_cast<rettype(*)parameters>(::func); \ +    }                                                   \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#else +# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); +   is like  _GL_CXXALIAS_SYS (func, rettype, parameters); +   except that the C function is picked among a set of overloaded functions, +   namely the one with rettype2 and parameters2.  Two consecutive casts +   are used to silence the "cannot find a match" and "invalid conversion" +   errors that would otherwise occur.  */ +#if defined __cplusplus && defined GNULIB_NAMESPACE +  /* The outer cast must be a reinterpret_cast. +     The inner cast: When the function is defined as a set of overloaded +     functions, it works as a static_cast<>, choosing the designated variant. +     When the function is defined as a single variant, it works as a +     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */ +# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ +    namespace GNULIB_NAMESPACE                                                \ +    {                                                                         \ +      static rettype (*func) parameters =                                     \ +        reinterpret_cast<rettype(*)parameters>(                               \ +          (rettype2(*)parameters2)(::func));                                  \ +    }                                                                         \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#else +# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +/* _GL_CXXALIASWARN (func); +   causes a warning to be emitted when ::func is used but not when +   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded +   variants.  */ +#if defined __cplusplus && defined GNULIB_NAMESPACE +# define _GL_CXXALIASWARN(func) \ +   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) +# define _GL_CXXALIASWARN_1(func,namespace) \ +   _GL_CXXALIASWARN_2 (func, namespace) +/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>, +   we enable the warning only when not optimizing.  */ +# if !__OPTIMIZE__ +#  define _GL_CXXALIASWARN_2(func,namespace) \ +    _GL_WARN_ON_USE (func, \ +                     "The symbol ::" #func " refers to the system function. " \ +                     "Use " #namespace "::" #func " instead.") +# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING +#  define _GL_CXXALIASWARN_2(func,namespace) \ +     extern __typeof__ (func) func +# else +#  define _GL_CXXALIASWARN_2(func,namespace) \ +     _GL_EXTERN_C int _gl_cxxalias_dummy +# endif +#else +# define _GL_CXXALIASWARN(func) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); +   causes a warning to be emitted when the given overloaded variant of ::func +   is used but not when GNULIB_NAMESPACE::func is used.  */ +#if defined __cplusplus && defined GNULIB_NAMESPACE +# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ +   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ +                        GNULIB_NAMESPACE) +# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ +   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) +/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>, +   we enable the warning only when not optimizing.  */ +# if !__OPTIMIZE__ +#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ +    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ +                         "The symbol ::" #func " refers to the system function. " \ +                         "Use " #namespace "::" #func " instead.") +# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING +#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ +     extern __typeof__ (func) func +# else +#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ +     _GL_EXTERN_C int _gl_cxxalias_dummy +# endif +#else +# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ +    _GL_EXTERN_C int _gl_cxxalias_dummy +#endif + +#endif /* _GL_CXXDEFS_H */  | 
