locale_conv.h
17.3 KB
-
Reduce code instantiated by filesystem::path::_S_convert_loc · 8281e3b8
Jakub noted in https://gcc.gnu.org/ml/libstdc++/2019-04/msg00140.html that an unwanted std::wstring::_M_replace_dispatch symbol has started to be exported from the Fedora shared library. This symbol is triggered by the instantiation of std::wstring::assign(const char*, const char*) from std::__str_codecvt_in which is called from path::_S_convert_loc. The branch that triggers that instantiation can't actually happen in that case, because codecvt facets will only return noconv when the input and output types are the same. Guarding the assign call with an if-constexpr check that the types are the same avoids instantiating template specializations that will never actually be needed. * config/abi/pre/gnu.ver (GLIBCXX_3.4): Replace wildcard that matches wstring::_M_replace_dispatch with more specific patterns. * include/bits/fs_path.h (path::_S_convert_loc<_InputIterator>): Create const std::string to avoid redundant call to _S_convert_loc with non-const pointers. * include/bits/locale_conv.h (__do_str_codecvt): Use if-constexpr to avoid unnecessary basic_string::assign instantiations. From-SVN: r270602
Jonathan Wakely committed