As I mentioned last week, the explicit instantiation definitions for std::string and std::wstring are compiled as C++11, so do not instantiate the new member functions added for C++17.
Rather than change what we instantiate and export from the library I'd prefer to suppress the explicit instantiation declarations for C++17. Once C++17 is stable and we know which new symbols are needed we can decide whether to change how we compile the instantiations, and add new exports to the linker script. * include/bits/basic_string.tcc: Disable explicit instantiation declarations for C++17. Tested powerpc64-linux, committed to trunk.
commit 248b39f993ea5f1fcc9668e38b7683e58c0facb8 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon Aug 1 16:28:09 2016 +0100 Disable std::string and std::wstring extern templates for C++17 * include/bits/basic_string.tcc: Disable explicit instantiation declarations for C++17. diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index 2b6644d..0560b46 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -1569,7 +1569,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Inhibit implicit instantiations for required instantiations, // which are defined via explicit instantiations elsewhere. -#if _GLIBCXX_EXTERN_TEMPLATE > 0 +#if _GLIBCXX_EXTERN_TEMPLATE > 0 && __cplusplus <= 201402L extern template class basic_string<char>; extern template basic_istream<char>&