From 090996f4a1186b1522e1225b6779d74ce9da250c Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Thu, 10 Aug 2023 13:47:43 +0200 Subject: [PATCH] [libc++] Work around dynamic linking of stringstream::str() on Windows Also `istringstream::str()` and `ostringstrem::str()`. https://github.com/llvm/llvm-project/issues/40363 causes `str()` to be dllimport'ed despite _LIBCPP_HIDE_FROM_ABI. This is a temporary solution until #40363 is fixed. Reviewed By: #libc, thakis, philnik Differential Revision: https://reviews.llvm.org/D157602 --- libcxx/include/sstream | 44 ++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/libcxx/include/sstream b/libcxx/include/sstream index 81255c878f7f..40930df24c6d 100644 --- a/libcxx/include/sstream +++ b/libcxx/include/sstream @@ -419,7 +419,7 @@ public: } _LIBCPP_HIDE_FROM_ABI basic_string_view view() const noexcept; -#endif +#endif // _LIBCPP_STD_VER >= 20 void str(const string_type& __s) { __str_ = __s; @@ -904,20 +904,22 @@ public: return const_cast*>(&__sb_); } -#if _LIBCPP_STD_VER >= 20 - _LIBCPP_HIDE_FROM_ABI string_type str() const & { return __sb_.str(); } +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY) + _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } +#else + _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() const & { return __sb_.str(); } + _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() && { return std::move(__sb_).str(); } +#endif + +#if _LIBCPP_STD_VER >= 20 template requires __is_allocator<_SAlloc>::value _LIBCPP_HIDE_FROM_ABI basic_string str(const _SAlloc& __sa) const { return __sb_.str(__sa); } - _LIBCPP_HIDE_FROM_ABI string_type str() && { return std::move(__sb_).str(); } - _LIBCPP_HIDE_FROM_ABI basic_string_view view() const noexcept { return __sb_.view(); } -#else // _LIBCPP_STD_VER >= 20 - _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); } @@ -1027,20 +1029,22 @@ public: return const_cast*>(&__sb_); } -#if _LIBCPP_STD_VER >= 20 - _LIBCPP_HIDE_FROM_ABI string_type str() const & { return __sb_.str(); } +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY) + _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } +#else + _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() const & { return __sb_.str(); } + _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() && { return std::move(__sb_).str(); } +#endif + +#if _LIBCPP_STD_VER >= 20 template requires __is_allocator<_SAlloc>::value _LIBCPP_HIDE_FROM_ABI basic_string str(const _SAlloc& __sa) const { return __sb_.str(__sa); } - _LIBCPP_HIDE_FROM_ABI string_type str() && { return std::move(__sb_).str(); } - _LIBCPP_HIDE_FROM_ABI basic_string_view view() const noexcept { return __sb_.view(); } -#else // _LIBCPP_STD_VER >= 20 - _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); } @@ -1149,20 +1153,22 @@ public: return const_cast*>(&__sb_); } -#if _LIBCPP_STD_VER >= 20 - _LIBCPP_HIDE_FROM_ABI string_type str() const & { return __sb_.str(); } +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_BUILDING_LIBRARY) + _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } +#else + _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() const & { return __sb_.str(); } + _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() && { return std::move(__sb_).str(); } +#endif + +#if _LIBCPP_STD_VER >= 20 template requires __is_allocator<_SAlloc>::value _LIBCPP_HIDE_FROM_ABI basic_string str(const _SAlloc& __sa) const { return __sb_.str(__sa); } - _LIBCPP_HIDE_FROM_ABI string_type str() && { return std::move(__sb_).str(); } - _LIBCPP_HIDE_FROM_ABI basic_string_view view() const noexcept { return __sb_.view(); } -#else // _LIBCPP_STD_VER >= 20 - _LIBCPP_HIDE_FROM_ABI string_type str() const { return __sb_.str(); } #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_HIDE_FROM_ABI void str(const string_type& __s) { __sb_.str(__s); }