https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86138

--- Comment #15 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Christian Franke from comment #13)
> This patch prevents duplicate _S_empty_rep_storage[] even on Cygwin (char
> only, wchar_t missing).  Testcase works as expected then:
> 
> --- basic_string.tcc.orig       2018-05-03 06:22:46.000000000 +0200
> +++ basic_string.tcc    2018-06-21 13:00:03.370070700 +0200
> @@ -1597,7 +1597,8 @@
> 
>    // Inhibit implicit instantiations for required instantiations,
>    // which are defined via explicit instantiations elsewhere.
> -#if _GLIBCXX_EXTERN_TEMPLATE > 0 && __cplusplus <= 201402L
> +#if _GLIBCXX_EXTERN_TEMPLATE > 0
> +#if __cplusplus <= 201402L
>    extern template class basic_string<char>;
>    extern template
>      basic_istream<char>&
> @@ -1627,6 +1628,12 @@
>      basic_istream<wchar_t>&
>      getline(basic_istream<wchar_t>&, wstring&);
>  #endif
> +
> +#else
> +  extern template
> +    basic_string<char>::size_type
> +    basic_string<char>::_Rep::_S_empty_rep_storage[];
> +#endif
>  #endif

This will only work for the old ABI, if you compile with
_GLIBCXX_USE_CXX11_ABI=1 those declarations are invalid.

But I like the basic idea, that will ensure that the part that must be unique
is unique, but the member functions that are C++17-only will still be
implicitly instantiated as needed.

I'll prepare a complete and correct version of this patch.

Reply via email to