util: Make Assert work with any value #19491
pull MarcoFalke wants to merge 1 commits into bitcoin:master from MarcoFalke:2007-utilAssert changing 2 files +11 −1-
MarcoFalke commented at 1:04 pm on July 11, 2020: memberGoal is to avoid compile failures
-
util: Make Assert work with any value fa53635381
-
MarcoFalke added the label Refactoring on Jul 11, 2020
-
MarcoFalke commented at 1:05 pm on July 11, 2020: memberCan be tested by reverting the changes to the header and observing compile failures in the test
-
practicalswift commented at 5:43 pm on July 11, 2020: contributorConcept ACK
-
jonatack commented at 6:33 pm on July 11, 2020: member
Interesting idea.
ACK fa5363538125d996ae5cede55f7f05e88701ace2
0 CXX wallet/test/test_test_bitcoin-coinselector_tests.o 1In file included from ./test/util/setup_common.h:15, 2 from test/util_tests.cpp:12: 3test/util_tests.cpp: In lambda function: 4test/util_tests.cpp:47:62: error: cannot bind non-const lvalue reference of type ‘std::unique_ptr<int>&’ to an rvalue of type ‘std::unique_ptr<int>’ 5 47 | const std::unique_ptr<int> p_two = Assert(MakeUnique<int>(2)); 6./util/check.h:57:80: note: in definition of macro ‘Assert’ 7 57 | #define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 8 | ^~~ 9test/util_tests.cpp: In member function ‘void util_tests::util_check::test_method()’: 10./util/check.h:57:125: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’ 11 57 | #define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 12 | ^ 13test/util_tests.cpp:47:40: note: in expansion of macro ‘Assert’ 14 47 | const std::unique_ptr<int> p_two = Assert(MakeUnique<int>(2)); 15 | ^~~~~~ 16In file included from /usr/include/c++/9/memory:80, 17 from /usr/include/boost/system/detail/std_interoperability.hpp:12, 18 from /usr/include/boost/system/error_code.hpp:959, 19 from /usr/include/boost/filesystem/path_traits.hpp:22, 20 from /usr/include/boost/filesystem/path.hpp:26, 21 from /usr/include/boost/filesystem.hpp:16, 22 from ./fs.h:14, 23 from ./util/system.h:20, 24 from test/util_tests.cpp:5: 25/usr/include/c++/9/bits/unique_ptr.h:414:7: note: declared here 26 414 | unique_ptr(const unique_ptr&) = delete; 27 | ^~~~~~~~~~ 28In file included from ./test/util/setup_common.h:15, 29 from test/util_tests.cpp:12: 30test/util_tests.cpp: In lambda function: 31test/util_tests.cpp:50:16: error: cannot bind non-const lvalue reference of type ‘bool&’ to an rvalue of type ‘bool’ 32 50 | Assert(two == 2); 33./util/check.h:57:80: note: in definition of macro ‘Assert’ 34 57 | #define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 35 | ^~~ 36test/util_tests.cpp: In lambda function: 37./util/check.h:57:83: error: cannot bind non-const lvalue reference of type ‘bool&’ to an rvalue of type ‘bool’ 38 57 | #define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 39 | ^ 40test/util_tests.cpp:51:5: note: in expansion of macro ‘Assert’ 41 51 | Assert(true); 42 | ^~~~~~ 43make[2]: *** [Makefile:17997: test/test_bitcoin-util_tests.o] Error 1 44make[2]: *** Waiting for unfinished jobs.... 45make[2]: Leaving directory '/home/jon/projects/bitcoin/bitcoin/src' 46make[1]: *** [Makefile:18328: all-recursive] Error 1 47make[1]: Leaving directory '/home/jon/projects/bitcoin/bitcoin/src' 48make: *** [Makefile:788: all-recursive] Error 1
0 CXX test/test_bitcoin-validation_flush_tests.o 1test/util_tests.cpp:47:40: error: non-const lvalue reference to type 'unique_ptr<...>' cannot bind to a temporary of type 'unique_ptr<...>' 2 const std::unique_ptr<int> p_two = Assert(MakeUnique<int>(2)); 3 ^~~~~~~~~~~~~~~~~~~~~~~~~~ 4./util/check.h:57:71: note: expanded from macro 'Assert' 5#define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 6 ^ ~~~~~ 7test/util_tests.cpp:47:32: error: call to deleted constructor of 'const std::unique_ptr<int>' 8 const std::unique_ptr<int> p_two = Assert(MakeUnique<int>(2)); 9 ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 10/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/unique_ptr.h:414:7: note: 'unique_ptr' has been explicitly marked deleted here 11 unique_ptr(const unique_ptr&) = delete; 12 ^ 13test/util_tests.cpp:50:5: error: non-const lvalue reference to type 'bool' cannot bind to a temporary of type 'bool' 14 Assert(two == 2); 15 ^~~~~~~~~~~~~~~~ 16./util/check.h:57:71: note: expanded from macro 'Assert' 17#define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 18 ^ ~~~~~ 19test/util_tests.cpp:51:5: error: non-const lvalue reference to type 'bool' cannot bind to a temporary of type 'bool' 20 Assert(true); 21 ^~~~~~~~~~~~ 22./util/check.h:57:71: note: expanded from macro 'Assert' 23#define Assert(val) [&]() -> decltype(get_pure_r_value(val))& { auto& check = (val); assert(#val && check); return check; }() 24 ^ ~~~~~ 254 errors generated. 26make[2]: *** [Makefile:17997: test/test_bitcoin-util_tests.o] Error 1 27make[2]: *** Waiting for unfinished jobs.... 28make[2]: Leaving directory '/home/jon/projects/bitcoin/bitcoin/src' 29make[1]: *** [Makefile:18328: all-recursive] Error 1 30make[1]: Leaving directory '/home/jon/projects/bitcoin/bitcoin/src' 31make: *** [Makefile:788: all-recursive] Error 1
-
ryanofsky approved
-
ryanofsky commented at 7:29 pm on July 14, 2020: member
Code review ACK fa5363538125d996ae5cede55f7f05e88701ace2. Looks like if argument is an lvalue this effectively does:
0T& Assert(T& check) { assert(check); return check; }
and if argument is an rvalue it does:
0T Assert(T&& check) { assert(check); return std::move(check); }
-
MarcoFalke merged this on Jul 15, 2020
-
MarcoFalke closed this on Jul 15, 2020
-
MarcoFalke deleted the branch on Jul 15, 2020
-
sidhujag referenced this in commit c7466e7847 on Jul 16, 2020
-
Fabcien referenced this in commit bf30e25f2b on Jun 15, 2021
-
DrahtBot locked this on Feb 15, 2022
github-metadata-mirror
This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 15:12 UTC
This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 15:12 UTC
This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me
More mirrored repositories can be found on mirror.b10c.me