This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] libstdc++/65630 add exports for operator+() with std::__cxx11::basic_string


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 <jwakely@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();
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]