Fix bootstrap with --enable-fully-dynamic-string
authorJonathan Wakely <jwakely@redhat.com>
Thu, 16 Aug 2018 15:56:21 +0000 (16:56 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 16 Aug 2018 15:56:21 +0000 (16:56 +0100)
PR libstdc++/86447
* src/c++11/cow-stdexcept.cc [_GLIBCXX_FULLY_DYNAMIC_STRING]
(logic_error::logic_error(logic_error&&))
(logic_error::operator=(logic_error&&))
(runtime_error::runtime_error(runtime_error&&))
(runtime_error::operator=(runtime_error&&)): Copy strings instead of
moving, to avoid allocating empty reps for moved-from strings.

From-SVN: r263590

libstdc++-v3/ChangeLog
libstdc++-v3/src/c++11/cow-stdexcept.cc

index ce8ccaf621fbf0fcab98a1483697499e0d42fe25..6c277ff728a66fc2a7201128addfd0dc0e4b6e98 100644 (file)
@@ -1,3 +1,13 @@
+2018-08-16  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/86447
+       * src/c++11/cow-stdexcept.cc [_GLIBCXX_FULLY_DYNAMIC_STRING]
+       (logic_error::logic_error(logic_error&&))
+       (logic_error::operator=(logic_error&&))
+       (runtime_error::runtime_error(runtime_error&&))
+       (runtime_error::operator=(runtime_error&&)): Copy strings instead of
+       moving, to avoid allocating empty reps for moved-from strings.
+
 2018-08-15  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/experimental/regex: Remove begin/end macros for namespace.
index 54859d58820c3e1389eac06b36b7789cede488e4..d271be529a6046debb8ea7e8b5c9524efd6968ca 100644 (file)
@@ -57,6 +57,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // These operations are noexcept even though copying a COW string is not,
   // but we know that the string member in an exception has not been "leaked"
   // so copying is a simple reference count increment.
+  // For the fully dynamic string moves are not noexcept (due to needing to
+  // allocate an empty string) so we just define the moves as copies here.
 
   logic_error::logic_error(const logic_error& e) noexcept
   : exception(e), _M_msg(e._M_msg) { }
@@ -64,10 +66,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   logic_error& logic_error::operator=(const logic_error& e) noexcept
   { _M_msg = e._M_msg; return *this; }
 
+#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
   logic_error::logic_error(logic_error&& e) noexcept = default;
 
   logic_error&
   logic_error::operator=(logic_error&& e) noexcept = default;
+#else
+  logic_error::logic_error(logic_error&& e) noexcept
+  : exception(e), _M_msg(e._M_msg) { }
+
+  logic_error&
+  logic_error::operator=(logic_error&& e) noexcept
+  { _M_msg = e._M_msg; return *this; }
+#endif
 
   runtime_error::runtime_error(const runtime_error& e) noexcept
   : exception(e), _M_msg(e._M_msg) { }
@@ -76,10 +87,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   runtime_error::operator=(const runtime_error& e) noexcept
   { _M_msg = e._M_msg; return *this; }
 
+#if _GLIBCXX_FULLY_DYNAMIC_STRING == 0
   runtime_error::runtime_error(runtime_error&& e) noexcept = default;
 
   runtime_error&
   runtime_error::operator=(runtime_error&& e) noexcept = default;
+#else
+  runtime_error::runtime_error(runtime_error&& e) noexcept
+  : exception(e), _M_msg(e._M_msg) { }
+
+  runtime_error&
+  runtime_error::operator=(runtime_error&& e) noexcept
+  { _M_msg = e._M_msg; return *this; }
+#endif
 
   // New C++11 constructors: