Merge #21317: util: Make Assume() usable as unary expression

fa4cebadcf util: Make Assume() usable as unary expression (MarcoFalke)

Pull request description:

  Assume shouldn't behave different at the call site depending on build flags. Currently compilation fails if it is used as expression. Fix that by using the lambda approach from `Assert()` without the `assert()`.

ACKs for top commit:
  jnewbery:
    ACK fa4cebadcf
  practicalswift:
    cr ACK fa4cebadcffd9112da4b13c7cc7ccf21e2bee887: patch looks correct and commit hash starts with `fa`

Tree-SHA512: 9ec9ac8d410cdaf5e4e28df571a89e3d23d38e05a7027bb726cae3da6e9314734277e5a218e9e090cc17e10db763da71052c229ad642077ca5824ee42022f3ed
pull/826/head
MarcoFalke 4 years ago
commit 1e4a3c057a
No known key found for this signature in database
GPG Key ID: D2EA4850E7528B25

@ -77,6 +77,9 @@ BOOST_AUTO_TEST_CASE(util_check)
const int two = *Assert(p_two); const int two = *Assert(p_two);
Assert(two == 2); Assert(two == 2);
Assert(true); Assert(true);
// Check that Assume can be used as unary expression
const bool result{Assume(two == 2)};
Assert(result);
} }
BOOST_AUTO_TEST_CASE(util_criticalsection) BOOST_AUTO_TEST_CASE(util_criticalsection)

@ -69,7 +69,7 @@ T get_pure_r_value(T&& val)
#ifdef ABORT_ON_FAILED_ASSUME #ifdef ABORT_ON_FAILED_ASSUME
#define Assume(val) Assert(val) #define Assume(val) Assert(val)
#else #else
#define Assume(val) ((void)(val)) #define Assume(val) ([&]() -> decltype(get_pure_r_value(val)) { auto&& check = (val); return std::forward<decltype(get_pure_r_value(val))>(check); }())
#endif #endif
#endif // BITCOIN_UTIL_CHECK_H #endif // BITCOIN_UTIL_CHECK_H

Loading…
Cancel
Save