Blame build-aux/snippet/c++defs.h

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