d72888d340
The explicit instantiation declarations for std::basic_string are disabled for C++17 (and later) so that basic_string symbols get implicitly instantiated in every translation unit that needs them. On targets that don't support STB_GNU_UNIQUE this leads to multiple copies of the empty rep symbol for COW strings. In order to detect whether a COW string needs to deallocate its storage it compares the address with the empty rep. When there are multiple copies of the empty rep object the address is not unique, and so string destructors try to delete the empty rep, which crashes. In order to guarantee uniqueness of the _S_empty_rep_storage symbol this patch adds an explicit instantiation declaration for just that symbol. This means the other symbols are still implicitly instantiated in C++17 code, but for the empty rep the definition in the library gets used. Separately, there is no need for C++17 code to implicitly instantiate the I/O functions for strings, so this also restores the explicit instantiation declarations for those functions. PR libstdc++/86138 * include/bits/basic_string.tcc: [__cplusplus > 201402 && !_GLIBCXX_USE_CXX11_ABI] (basic_string<char>::_Rep::_S_empty_rep_storage) (basic_string<wchar_t>::_Rep::_S_empty_rep_storage): Add explicit instantiation declarations. [__cplusplus > 201402] (operator>>, operator<<, getline): Re-enable explicit instantiation declarations. * testsuite/21_strings/basic_string/cons/char/86138.cc: New. * testsuite/21_strings/basic_string/cons/wchar_t/86138.cc: New. From-SVN: r261873 |
||
---|---|---|
.. | ||
basic_string | ||
basic_string_view | ||
c_strings | ||
char_traits/requirements | ||
debug | ||
headers |