Wrap try-catch blocks for -fno-exceptions

This commit is contained in:
Simon Brand
2019-05-02 09:16:31 +01:00
parent 2c9780949d
commit aa22af4d9d

View File

@@ -719,12 +719,16 @@ struct expected_operations_base : expected_storage_base<T, E> {
auto tmp = std::move(geterr()); auto tmp = std::move(geterr());
geterr().~unexpected<E>(); geterr().~unexpected<E>();
#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED
try { try {
construct(rhs.get()); construct(rhs.get());
} catch (...) { } catch (...) {
geterr() = std::move(tmp); geterr() = std::move(tmp);
throw; throw;
} }
#else
construct(rhs.get());
#endif
} else { } else {
assign_common(rhs); assign_common(rhs);
} }
@@ -750,12 +754,16 @@ struct expected_operations_base : expected_storage_base<T, E> {
if (!this->m_has_val && rhs.m_has_val) { if (!this->m_has_val && rhs.m_has_val) {
auto tmp = std::move(geterr()); auto tmp = std::move(geterr());
geterr().~unexpected<E>(); geterr().~unexpected<E>();
#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED
try { try {
construct(std::move(rhs).get()); construct(std::move(rhs).get());
} catch (...) { } catch (...) {
geterr() = std::move(tmp); geterr() = std::move(tmp);
throw; throw;
} }
#else
construct(std::move(rhs).get());
#endif
} else { } else {
assign_common(std::move(rhs)); assign_common(std::move(rhs));
} }
@@ -1879,6 +1887,7 @@ private:
move_constructing_e_can_throw) { move_constructing_e_can_throw) {
auto temp = std::move(val()); auto temp = std::move(val());
val().~T(); val().~T();
#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED
try { try {
::new (errptr()) unexpected_type(std::move(rhs.err())); ::new (errptr()) unexpected_type(std::move(rhs.err()));
rhs.err().~unexpected_type(); rhs.err().~unexpected_type();
@@ -1888,6 +1897,12 @@ private:
val() = std::move(temp); val() = std::move(temp);
throw; throw;
} }
#else
::new (errptr()) unexpected_type(std::move(rhs.err()));
rhs.err().~unexpected_type();
::new (rhs.valptr()) T(std::move(temp));
std::swap(this->m_has_val, rhs.m_has_val);
#endif
} }
void swap_where_only_one_has_value_and_t_is_not_void( void swap_where_only_one_has_value_and_t_is_not_void(
@@ -1895,6 +1910,7 @@ private:
t_is_nothrow_move_constructible) { t_is_nothrow_move_constructible) {
auto temp = std::move(rhs.err()); auto temp = std::move(rhs.err());
rhs.err().~unexpected_type(); rhs.err().~unexpected_type();
#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED
try { try {
::new (rhs.valptr()) T(val()); ::new (rhs.valptr()) T(val());
val().~T(); val().~T();
@@ -1904,6 +1920,12 @@ private:
rhs.err() = std::move(temp); rhs.err() = std::move(temp);
throw; throw;
} }
#else
::new (rhs.valptr()) T(val());
val().~T();
::new (errptr()) unexpected_type(std::move(temp));
std::swap(this->m_has_val, rhs.m_has_val);
#endif
} }
public: public: