forked from TartanLlama/expected
Wrap try-catch blocks for -fno-exceptions
This commit is contained in:
@@ -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:
|
||||||
|
Reference in New Issue
Block a user