aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-11-01 13:47:24 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-11-02 12:54:16 +0000
commitf4874691812bc20e3d8e3302db439c27f30c472c (patch)
tree99b9be831ea469f73b4e8ea163fde347b07a2f70
parentcf35818a390e7cb4b1a4fa70c243ede59d6cbbac (diff)
downloadgcc-f4874691812bc20e3d8e3302db439c27f30c472c.zip
gcc-f4874691812bc20e3d8e3302db439c27f30c472c.tar.gz
gcc-f4874691812bc20e3d8e3302db439c27f30c472c.tar.bz2
libstdc++: Remove unnecessary variant member in std::expected
Hui Xie pointed out that we don't need a dummy member in the union, because all constructors always initialize either _M_val or _M_unex. We still need the _M_void member of the expected<void, E> specialization, because the constructor has to initialize something when not using the _M_unex member. libstdc++-v3/ChangeLog: * include/std/expected (expected::_M_invalid): Remove.
-rw-r--r--libstdc++-v3/include/std/expected9
1 files changed, 4 insertions, 5 deletions
diff --git a/libstdc++-v3/include/std/expected b/libstdc++-v3/include/std/expected
index 3ee13aa..e491ce4 100644
--- a/libstdc++-v3/include/std/expected
+++ b/libstdc++-v3/include/std/expected
@@ -359,7 +359,7 @@ namespace __expected
requires is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Er>
&& (!is_trivially_copy_constructible_v<_Tp>
|| !is_trivially_copy_constructible_v<_Er>)
- : _M_invalid(), _M_has_value(__x._M_has_value)
+ : _M_has_value(__x._M_has_value)
{
if (_M_has_value)
std::construct_at(__builtin_addressof(_M_val), __x._M_val);
@@ -376,7 +376,7 @@ namespace __expected
requires is_move_constructible_v<_Tp> && is_move_constructible_v<_Er>
&& (!is_trivially_move_constructible_v<_Tp>
|| !is_trivially_move_constructible_v<_Er>)
- : _M_invalid(), _M_has_value(__x._M_has_value)
+ : _M_has_value(__x._M_has_value)
{
if (_M_has_value)
std::construct_at(__builtin_addressof(_M_val),
@@ -394,7 +394,7 @@ namespace __expected
expected(const expected<_Up, _Gr>& __x)
noexcept(__and_v<is_nothrow_constructible<_Tp, const _Up&>,
is_nothrow_constructible<_Er, const _Gr&>>)
- : _M_invalid(), _M_has_value(__x._M_has_value)
+ : _M_has_value(__x._M_has_value)
{
if (_M_has_value)
std::construct_at(__builtin_addressof(_M_val), __x._M_val);
@@ -410,7 +410,7 @@ namespace __expected
expected(expected<_Up, _Gr>&& __x)
noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
is_nothrow_constructible<_Er, _Gr>>)
- : _M_invalid(), _M_has_value(__x._M_has_value)
+ : _M_has_value(__x._M_has_value)
{
if (_M_has_value)
std::construct_at(__builtin_addressof(_M_val),
@@ -890,7 +890,6 @@ namespace __expected
}
union {
- struct { } _M_invalid;
_Tp _M_val;
_Er _M_unex;
};