aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-01-09 10:40:49 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-01-09 10:40:49 +0000
commit50b0a3d672fba49a69056e4a70fcc318d8d4c7df (patch)
tree30f05061b35e63e38f9190b39e3f40c022ee9ee3
parent5ed895a74a12da82d2adafda7e6196de8221ddd2 (diff)
downloadgcc-50b0a3d672fba49a69056e4a70fcc318d8d4c7df.zip
gcc-50b0a3d672fba49a69056e4a70fcc318d8d4c7df.tar.gz
gcc-50b0a3d672fba49a69056e4a70fcc318d8d4c7df.tar.bz2
Remove some more code duplication in std::optional
Hoist the duplicated code from the _Optional_payload partial specializations into the _Optional_payload_base base class. * include/std/optional (_Optional_payload_base::_M_copy_assign): New member function to perform non-trivial assignment. (_Optional_payload_base::_M_move_assign): Likewise. (_Optional_payload<T, true, false, true>::operator=) (_Optional_payload<T, true, true, false>::operator=) (_Optional_payload<T, true, false, false>::operator=): Call _M_copy_assign and/or _M_move_assign to do non-trivial assignments. From-SVN: r267761
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/std/optional74
2 files changed, 45 insertions, 37 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 870fce2..d0f060d 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,13 @@
2019-01-09 Jonathan Wakely <jwakely@redhat.com>
+ * include/std/optional (_Optional_payload_base::_M_copy_assign): New
+ member function to perform non-trivial assignment.
+ (_Optional_payload_base::_M_move_assign): Likewise.
+ (_Optional_payload<T, true, false, true>::operator=)
+ (_Optional_payload<T, true, true, false>::operator=)
+ (_Optional_payload<T, true, false, false>::operator=): Call
+ _M_copy_assign and/or _M_move_assign to do non-trivial assignments.
+
PR libstdc++/88204
* testsuite/26_numerics/complex/operators/more_constexpr.cc: Do not
test std::complex<long double> if long double format is IBM128.
diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
index b06e30f..c5e66bd 100644
--- a/libstdc++-v3/include/std/optional
+++ b/libstdc++-v3/include/std/optional
@@ -157,6 +157,38 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Optional_payload_base&
operator=(_Optional_payload_base&&) = default;
+ // used to perform non-trivial copy assignment.
+ constexpr void
+ _M_copy_assign(const _Optional_payload_base& __other)
+ {
+ if (this->_M_engaged && __other._M_engaged)
+ this->_M_get() = __other._M_get();
+ else
+ {
+ if (__other._M_engaged)
+ this->_M_construct(__other._M_get());
+ else
+ this->_M_reset();
+ }
+ }
+
+ // used to perform non-trivial move assignment.
+ constexpr void
+ _M_move_assign(_Optional_payload_base&& __other)
+ noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
+ is_nothrow_move_assignable<_Tp>>)
+ {
+ if (this->_M_engaged && __other._M_engaged)
+ this->_M_get() = std::move(__other._M_get());
+ else
+ {
+ if (__other._M_engaged)
+ this->_M_construct(std::move(__other._M_get()));
+ else
+ this->_M_reset();
+ }
+ }
+
struct _Empty_byte { };
template<typename _Up, bool = is_trivially_destructible_v<_Up>>
@@ -286,15 +318,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Optional_payload&
operator=(const _Optional_payload& __other)
{
- if (this->_M_engaged && __other._M_engaged)
- this->_M_get() = __other._M_get();
- else
- {
- if (__other._M_engaged)
- this->_M_construct(__other._M_get());
- else
- this->_M_reset();
- }
+ this->_M_copy_assign(__other);
return *this;
}
};
@@ -319,15 +343,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
is_nothrow_move_assignable<_Tp>>)
{
- if (this->_M_engaged && __other._M_engaged)
- this->_M_get() = std::move(__other._M_get());
- else
- {
- if (__other._M_engaged)
- this->_M_construct(std::move(__other._M_get()));
- else
- this->_M_reset();
- }
+ this->_M_move_assign(std::move(__other));
return *this;
}
};
@@ -344,20 +360,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Optional_payload(const _Optional_payload&) = default;
_Optional_payload(_Optional_payload&&) = default;
- // Non-trivial copy
+ // Non-trivial copy assignment.
constexpr
_Optional_payload&
operator=(const _Optional_payload& __other)
{
- if (this->_M_engaged && __other._M_engaged)
- this->_M_get() = __other._M_get();
- else
- {
- if (__other._M_engaged)
- this->_M_construct(__other._M_get());
- else
- this->_M_reset();
- }
+ this->_M_copy_assign(__other);
return *this;
}
@@ -368,15 +376,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
is_nothrow_move_assignable<_Tp>>)
{
- if (this->_M_engaged && __other._M_engaged)
- this->_M_get() = std::move(__other._M_get());
- else
- {
- if (__other._M_engaged)
- this->_M_construct(std::move(__other._M_get()));
- else
- this->_M_reset();
- }
+ this->_M_move_assign(std::move(__other));
return *this;
}
};