mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-19 06:43:45 +01:00
Merge #20255: util: Add Assume() identity function
faa05854f8util: Remove probably misleading TODO (MarcoFalke)fac5efe730util: Add Assume() identity function (MarcoFalke)fa861569dcutil: Allow Assert(...) to be used in all contexts (practicalswift) Pull request description: This is needed for #20138. Please refer to the added documentation for motivation. ACKs for top commit: practicalswift: cr ACKfaa05854f8jnewbery: utACKfaa05854f8hebasto: ACKfaa05854f8, I have reviewed the code and it looks OK, I agree it can be merged. Tree-SHA512: 72165fbd898b92ab9a79b070993fa1faa86c2e3545b6645e72c652bda295d5107bc298d0482bf3aaf0926fc0c3e6418a445c0e073b08568c44231f547f76a688
This commit is contained in:
@@ -46,7 +46,7 @@ class NonFatalCheckError : public std::runtime_error
|
||||
#error "Cannot compile without assertions!"
|
||||
#endif
|
||||
|
||||
/** Helper for Assert(). TODO remove in C++14 and replace `decltype(get_pure_r_value(val))` with `T` (templated lambda) */
|
||||
/** Helper for Assert() */
|
||||
template <typename T>
|
||||
T get_pure_r_value(T&& val)
|
||||
{
|
||||
@@ -54,6 +54,22 @@ T get_pure_r_value(T&& val)
|
||||
}
|
||||
|
||||
/** Identity function. Abort if the value compares equal to zero */
|
||||
#define Assert(val) [&]() -> decltype(get_pure_r_value(val)) { auto&& check = (val); assert(#val && check); return std::forward<decltype(get_pure_r_value(val))>(check); }()
|
||||
#define Assert(val) ([&]() -> decltype(get_pure_r_value(val)) { auto&& check = (val); assert(#val && check); return std::forward<decltype(get_pure_r_value(val))>(check); }())
|
||||
|
||||
/**
|
||||
* Assume is the identity function.
|
||||
*
|
||||
* - Should be used to run non-fatal checks. In debug builds it behaves like
|
||||
* Assert()/assert() to notify developers and testers about non-fatal errors.
|
||||
* In production it doesn't warn or log anything.
|
||||
* - For fatal errors, use Assert().
|
||||
* - For non-fatal errors in interactive sessions (e.g. RPC or command line
|
||||
* interfaces), CHECK_NONFATAL() might be more appropriate.
|
||||
*/
|
||||
#ifdef ABORT_ON_FAILED_ASSUME
|
||||
#define Assume(val) Assert(val)
|
||||
#else
|
||||
#define Assume(val) ((void)(val))
|
||||
#endif
|
||||
|
||||
#endif // BITCOIN_UTIL_CHECK_H
|
||||
|
||||
Reference in New Issue
Block a user