diff mbox series

Fix bootstrap with --enable-fully-dynamic-string

Message ID 20180816155608.GA22970@redhat.com
State New
Headers show
Series Fix bootstrap with --enable-fully-dynamic-string | expand

Commit Message

Jonathan Wakely Aug. 16, 2018, 3:56 p.m. UTC
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.

Tested x86_64-linux, committed to trunk.
commit b06d2a88c3ea36c41c370cf95730d54f764b9f47
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Aug 16 15:31:40 2018 +0100

    Fix bootstrap with --enable-fully-dynamic-string
    
            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.
diff mbox series

Patch

diff --git a/libstdc++-v3/src/c++11/cow-stdexcept.cc b/libstdc++-v3/src/c++11/cow-stdexcept.cc
index 54859d58820..d271be529a6 100644
--- a/libstdc++-v3/src/c++11/cow-stdexcept.cc
+++ b/libstdc++-v3/src/c++11/cow-stdexcept.cc
@@ -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: