From f74736dd143843da3dc15103ffcdaa6d8d20cc39 Mon Sep 17 00:00:00 2001 From: Alexey Ochapov Date: Wed, 4 Nov 2020 23:47:25 +0300 Subject: [PATCH] FMT_COMPILE_STRING_VISIBILITY_ATTRIBUTE -> FMT_GCC_VISIBILITY_HIDDEN, add comments --- include/fmt/format.h | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/include/fmt/format.h b/include/fmt/format.h index 7de07422..537bd9c4 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -69,6 +69,13 @@ # define FMT_NOINLINE #endif +// Special definition specific to GCC only +#if FMT_GCC_VERSION +# define FMT_GCC_VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) +#else +# define FMT_GCC_VISIBILITY_HIDDEN +#endif + #if __cplusplus == 201103L || __cplusplus == 201402L # if defined(__INTEL_COMPILER) || defined(__PGI) # define FMT_FALLTHROUGH @@ -3198,24 +3205,19 @@ FMT_CONSTEXPR basic_string_view compile_string_to_view( return {s.data(), s.size()}; } -#if FMT_GCC_VERSION -# define FMT_COMPILE_STRING_VISIBILITY_ATTRIBUTE \ - __attribute__((visibility("hidden"))) -#else -# define FMT_COMPILE_STRING_VISIBILITY_ATTRIBUTE -#endif - -#define FMT_STRING_IMPL(s, base) \ - [] { \ - /* Use a macro-like name to avoid shadowing warnings. */ \ - struct FMT_COMPILE_STRING_VISIBILITY_ATTRIBUTE FMT_COMPILE_STRING : base { \ - using char_type = fmt::remove_cvref_t; \ - FMT_MAYBE_UNUSED FMT_CONSTEXPR \ - operator fmt::basic_string_view() const { \ - return fmt::detail::compile_string_to_view(s); \ - } \ - }; \ - return FMT_COMPILE_STRING(); \ +#define FMT_STRING_IMPL(s, base) \ + [] { \ + /* Use a hidden visibility as workaround for some GCC, see */ \ + /* https://github.com/fmtlib/fmt/issues/1973 for details */ \ + /* Use a macro-like name to avoid shadowing warnings. */ \ + struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base { \ + using char_type = fmt::remove_cvref_t; \ + FMT_MAYBE_UNUSED FMT_CONSTEXPR \ + operator fmt::basic_string_view() const { \ + return fmt::detail::compile_string_to_view(s); \ + } \ + }; \ + return FMT_COMPILE_STRING(); \ }() /**