From 0973f141b9daa0ac32ea3093b60b70aacacc5ea9 Mon Sep 17 00:00:00 2001 From: mrg Date: Sat, 24 Apr 2021 21:17:40 +0000 Subject: [PATCH] move the NetBSD version of: __convert_from_v(const __c_locale& __cloc, char* __out, const int __size __attribute__ ((__unused__)), const char* __fmt, ...) from the .h file into the .cc file. NetBSD version relies upon vasprintf_l() being defined and compile contexts such as _XOPEN_SOURCE=600 or _POSIX_C_SOURCE < 200809 may not provide the definition of it, cause compile time issues for 3rdparty applications in c++locale.h. This ensure that all the required definitions are present when this code is compiled. --- .../config/locale/dragonfly/c_locale.cc | 20 +++++++++++++++++ .../config/locale/dragonfly/c_locale.h | 22 +++++++++++-------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.cc b/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.cc index f0557fc07080..ce35ddb1a57f 100644 --- a/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.cc +++ b/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.cc @@ -28,6 +28,8 @@ // Written by Benjamin Kosnik // Modified for DragonFly by John Marino +// Modified for NetBSD by Christos Zoulas and +// matthew green #include #include @@ -191,6 +193,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const char* const* const locale::_S_categories = __gnu_cxx::category_names; +#ifdef __NetBSD__ + int + __convert_from_v(const __c_locale& __cloc, char* __out, + const int __size __attribute__ ((__unused__)), + const char* __fmt, ...) + { + __builtin_va_list __args; + __builtin_va_start(__args, __fmt); + + const int __ret = vsnprintf_l(__out, __size, (struct _locale *)__cloc, + __fmt, __args); + + __builtin_va_end(__args); + + return __ret; + } +#endif + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.h b/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.h index 5b307bfcb79a..55c9f5c72ac7 100644 --- a/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.h +++ b/external/gpl3/gcc/dist/libstdc++-v3/config/locale/dragonfly/c_locale.h @@ -33,6 +33,8 @@ // Written by Benjamin Kosnik // Modified for DragonFly by John Marino +// Modified for NetBSD by Christos Zoulas and +// matthew green #ifndef _GLIBCXX_CXX_LOCALE_H #define _GLIBCXX_CXX_LOCALE_H 1 @@ -54,6 +56,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef int* __c_locale; +#ifndef __NetBSD__ // Convert numeric value of type double and long double to string and // return length of string. If vsnprintf is available use it, otherwise // fall back to the unsafe vsprintf which, in general, can be dangerous @@ -63,30 +66,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const int __size __attribute__ ((__unused__)), const char* __fmt, ...) { -#ifndef __NetBSD__ __c_locale __old = (__c_locale)uselocale((locale_t)__cloc); -#endif __builtin_va_list __args; __builtin_va_start(__args, __fmt); -#ifndef __NetBSD__ #if _GLIBCXX_USE_C99_STDIO const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args); #else const int __ret = __builtin_vsprintf(__out, __fmt, __args); #endif - uselocale((locale_t)__old); -#else - const int __ret = vsnprintf_l(__out, __size, (locale_t)__cloc, __fmt, - __args); -#endif - __builtin_va_end(__args); + uselocale((locale_t)__old); return __ret; } +#else + // NetBSD backend requires vasprintf_l() which may not be visible in + // all complation environments (eg, _XOPEN_SOURCE=600) so the backend + // lives in the library code, instead of this header. + int + __convert_from_v(const __c_locale& __cloc, char* __out, + const int __size __attribute__ ((__unused__)), + const char* __fmt, ...); +#endif _GLIBCXX_END_NAMESPACE_VERSION } // namespace