From: Jonathan Wakely Date: Thu, 16 Aug 2018 15:56:21 +0000 (+0100) Subject: Fix bootstrap with --enable-fully-dynamic-string X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=891b1d6872ecf18ccf605d036f8f01dec32d66a4;p=gcc.git 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. From-SVN: r263590 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ce8ccaf621f..6c277ff728a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2018-08-16 Jonathan Wakely + + 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 * include/experimental/regex: Remove begin/end macros for namespace. 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: