In the library we instantiate these functions: template S operator+(const C*, const S&); template S operator+(C, const S&); template S operator+(const S&, const S&);
We have a Fedora bug report for a package which uses -fno-implicit-templates and then expects to find these instantations in the library. I didn't add the linker script exports for the new versions of the functions, so they were not usable outside the library, causing the package to fail to link when using the new std::string ABI. Since we've always exported these for the old std::string I think we should continue to do so for the new std::string as well. When we're in stage 1 I think we should also add 'extern template' declarations for these instantiations, so that we actually tell the compiler they exist and everyone can benefit from them, not only broken packages (mis)using -fno-implicit-templates. Tested x86_64-linux, committed to trunk.
commit fa966b81598ee4d4b201cd17e21263146ac02992 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon Mar 30 14:35:31 2015 +0100 PR libstdc++/65630 * config/abi/pre/gnu.ver: Export operator+ for new strings. * testsuite/21_strings/basic_string/operators/char/65630.cc: New. * testsuite/21_strings/basic_string/operators/wchar_t/65630.cc: New. diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 6028acf..d2116fa 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1675,6 +1675,9 @@ GLIBCXX_3.4.21 { _ZNSt7__cxx1112basic_string*; _ZNKSt7__cxx1112basic_string*; + # operator+ for ABI-tagged std::basic_string + _ZStplI[cw]St11char_traitsI[cw]ESaI[cw]EENSt7__cxx1112basic_stringIT_T0_T1_EE*; + # ABI-tagged stringstreams _ZNSt7__cxx1115basic_stringbuf*; _ZNSt7__cxx1118basic_stringstream*; diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operators/char/65630.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operators/char/65630.cc new file mode 100644 index 0000000..04be512 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/operators/char/65630.cc @@ -0,0 +1,34 @@ +// Copyright (C) 2015 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++11 -fno-implicit-templates -O0" } +// { dg-do link } + +#include <string> + +void test01() +{ + std::string t; + t = t + t; + t = "" + t; + t = 't' + t; +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operators/wchar_t/65630.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operators/wchar_t/65630.cc new file mode 100644 index 0000000..a07e599 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/operators/wchar_t/65630.cc @@ -0,0 +1,34 @@ +// Copyright (C) 2015 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++11 -fno-implicit-templates -O0" } +// { dg-do link } + +#include <string> + +void test01() +{ + std::wstring t; + t = t + t; + t = L"" + t; + t = L't' + t; +} + +int main() +{ + test01(); +}