105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_CXXDEFS_H 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_CXXDEFS_H 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The three most frequent use cases of these macros are: 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang * For providing a substitute for a function that is missing on some 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang platforms, but is declared and works fine on the platforms on which 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang it exists: 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang #if @GNULIB_FOO@ 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang # if !@HAVE_FOO@ 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_SYS (foo, ...); 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang # endif 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_SYS (foo, ...); 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN (foo); 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang #elif defined GNULIB_POSIXCHECK 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang ... 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang #endif 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang * For providing a replacement for a function that exists on all platforms, 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang but is broken/insufficient and needs to be replaced on some platforms: 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang #if @GNULIB_FOO@ 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang # if @REPLACE_FOO@ 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang # undef foo 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang # define foo rpl_foo 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang # endif 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_RPL (foo, ...); 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_RPL (foo, ...); 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang # else 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_SYS (foo, ...); 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang # endif 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN (foo); 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang #elif defined GNULIB_POSIXCHECK 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang ... 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang #endif 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang * For providing a replacement for a function that exists on some platforms 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang but is broken/insufficient and needs to be replaced on some of them and 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang is additionally either missing or undeclared on some other platforms: 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang #if @GNULIB_FOO@ 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang # if @REPLACE_FOO@ 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang # undef foo 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang # define foo rpl_foo 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang # endif 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_RPL (foo, ...); 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_RPL (foo, ...); 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang # else 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@ 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_SYS (foo, ...); 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang # endif 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_SYS (foo, ...); 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang # endif 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN (foo); 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang #elif defined GNULIB_POSIXCHECK 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ... 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang #endif 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang*/ 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_EXTERN_C declaration; 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang performs the declaration with C linkage. */ 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_EXTERN_C extern "C" 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_EXTERN_C extern 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang declares a replacement function, named rpl_func, with the given prototype, 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang consisting of return type, parameters, and attributes. 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang Example: 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ARG_NONNULL ((1))); 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C rettype rpl_func parameters_and_attributes 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang declares the system function, named func, with the given prototype, 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang consisting of return type, parameters, and attributes. 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang Example: 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ARG_NONNULL ((1))); 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C rettype func parameters_and_attributes 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_RPL (func, rettype, parameters); 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang declares a C++ alias called GNULIB_NAMESPACE::func 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang that redirects to rpl_func, if GNULIB_NAMESPACE is defined. 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang Example: 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_CXXALIAS_RPL(func,rettype,parameters) \ 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang namespace GNULIB_NAMESPACE \ 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { \ 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang rettype (*const func) parameters = ::rpl_func; \ 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } \ 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang except that the C function rpl_func may have a slightly different 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang declaration. A cast is used to silence the "invalid conversion" error 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang that would otherwise occur. */ 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang namespace GNULIB_NAMESPACE \ 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { \ 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang rettype (*const func) parameters = \ 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang reinterpret_cast<rettype(*)parameters>(::rpl_func); \ 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } \ 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_SYS (func, rettype, parameters); 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang declares a C++ alias called GNULIB_NAMESPACE::func 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang that redirects to the system provided function func, if GNULIB_NAMESPACE 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang is defined. 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang Example: 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* If we were to write 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang rettype (*const func) parameters = ::func; 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang better (remove an indirection through a 'static' pointer variable), 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang but then the _GL_CXXALIASWARN macro below would cause a warning not only 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */ 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS(func,rettype,parameters) \ 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang namespace GNULIB_NAMESPACE \ 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { \ 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang static rettype (*func) parameters = ::func; \ 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } \ 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS(func,rettype,parameters) \ 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang is like _GL_CXXALIAS_SYS (func, rettype, parameters); 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang except that the C function func may have a slightly different declaration. 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang A cast is used to silence the "invalid conversion" error that would 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang otherwise occur. */ 16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang namespace GNULIB_NAMESPACE \ 16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { \ 16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang static rettype (*func) parameters = \ 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang reinterpret_cast<rettype(*)parameters>(::func); \ 16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } \ 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang is like _GL_CXXALIAS_SYS (func, rettype, parameters); 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang except that the C function is picked among a set of overloaded functions, 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang namely the one with rettype2 and parameters2. Two consecutive casts 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang are used to silence the "cannot find a match" and "invalid conversion" 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang errors that would otherwise occur. */ 18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* The outer cast must be a reinterpret_cast. 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang The inner cast: When the function is defined as a set of overloaded 18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang functions, it works as a static_cast<>, choosing the designated variant. 18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang When the function is defined as a single variant, it works as a 18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang reinterpret_cast<>. The parenthesized cast syntax works both ways. */ 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang namespace GNULIB_NAMESPACE \ 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang { \ 18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang static rettype (*func) parameters = \ 19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang reinterpret_cast<rettype(*)parameters>( \ 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang (rettype2(*)parameters2)(::func)); \ 19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } \ 19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ 19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIASWARN (func); 20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang causes a warning to be emitted when ::func is used but not when 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang GNULIB_NAMESPACE::func is used. func must be defined without overloaded 20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang variants. */ 20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN(func) \ 20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) 20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN_1(func,namespace) \ 20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN_2 (func, namespace) 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>, 20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang we enable the warning only when not optimizing. */ 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !__OPTIMIZE__ 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN_2(func,namespace) \ 21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_WARN_ON_USE (func, \ 21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang "The symbol ::" #func " refers to the system function. " \ 21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang "Use " #namespace "::" #func " instead.") 21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN_2(func,namespace) \ 21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang extern __typeof__ (func) func 21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else 21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN_2(func,namespace) \ 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif 22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN(func) \ 22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang causes a warning to be emitted when the given overloaded variant of ::func 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang is used but not when GNULIB_NAMESPACE::func is used. */ 23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE 23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ 23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang GNULIB_NAMESPACE) 23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ 23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) 23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>, 23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang we enable the warning only when not optimizing. */ 23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !__OPTIMIZE__ 23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ 24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ 24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang "The symbol ::" #func " refers to the system function. " \ 24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang "Use " #namespace "::" #func " instead.") 24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING 24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ 24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang extern __typeof__ (func) func 24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ 24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif 25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_EXTERN_C int _gl_cxxalias_dummy 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _GL_CXXDEFS_H */ 256