From 4de0d85abf050536ca844b879d341c014d47e9a9 Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Sat, 3 Sep 2022 16:41:30 +0100 Subject: [PATCH] The std::expected proposal has unnecessary instances of undefined behaviour for operator->, operator*, and error(). Make these into assertion failures (this still conforms to the proposal). Signed-off-by: Daira Hopwood --- contrib/debian/copyright | 2 +- depends/packages/tl_expected.mk | 5 ++ .../remove-undefined-behaviour.diff | 78 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 depends/patches/tl_expected/remove-undefined-behaviour.diff diff --git a/contrib/debian/copyright b/contrib/debian/copyright index 9592b10e9..b82cf4330 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -161,7 +161,7 @@ Copyright: 2006 Nemanja Trifunovic License: Boost-Software-License-1.0 Files: depends/sources/tl-expected-*.tar.gz -Copyright: 2017-2021 Sy Brand (@TartanLlama) +Copyright: 2017-2021 Sy Brand (@TartanLlama), 2022 The Zcash developers License: CC0-1.0 Comment: Other contributors are Simon Truscott (@bobbleclank), Kévin Alexandre Boissonneault (@KABoissonneault), and Björn Fahller (@rollbear). diff --git a/depends/packages/tl_expected.mk b/depends/packages/tl_expected.mk index 700e1d108..9e378026c 100644 --- a/depends/packages/tl_expected.mk +++ b/depends/packages/tl_expected.mk @@ -4,6 +4,11 @@ $(package)_download_path=https://github.com/TartanLlama/expected/archive $(package)_download_file=96d547c03d2feab8db64c53c3744a9b4a7c8f2c5.tar.gz $(package)_file_name=tl-expected-1.0.1.tar.gz $(package)_sha256_hash=64901df1de9a5a3737b331d3e1de146fa6ffb997017368b322c08f45c51b90a7 +$(package)_patches=remove-undefined-behaviour.diff + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/remove-undefined-behaviour.diff +endef define $(package)_stage_cmds mkdir $($(package)_staging_dir)$(host_prefix)/include && \ diff --git a/depends/patches/tl_expected/remove-undefined-behaviour.diff b/depends/patches/tl_expected/remove-undefined-behaviour.diff new file mode 100644 index 000000000..84b60e0c5 --- /dev/null +++ b/depends/patches/tl_expected/remove-undefined-behaviour.diff @@ -0,0 +1,78 @@ +diff --recursive --unified tl-expected-1.0.1-orig/include/tl/expected.hpp tl-expected-1.0.1/include/tl/expected.hpp +--- tl-expected-1.0.1-orig/include/tl/expected.hpp 2022-08-30 20:10:13.269489852 +0100 ++++ tl-expected-1.0.1/include/tl/expected.hpp 2022-08-30 20:17:35.744258828 +0100 +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + #if defined(__EXCEPTIONS) || defined(_CPPUNWIND) + #define TL_EXPECTED_EXCEPTIONS_ENABLED +@@ -1862,27 +1863,37 @@ + } + } + +- constexpr const T *operator->() const { return valptr(); } +- TL_EXPECTED_11_CONSTEXPR T *operator->() { return valptr(); } ++ constexpr const T *operator->() const { ++ assert(has_value()); ++ return valptr(); ++ } ++ TL_EXPECTED_11_CONSTEXPR T *operator->() { ++ assert(has_value()); ++ return valptr(); ++ } + + template ::value> * = nullptr> + constexpr const U &operator*() const & { ++ assert(has_value()); + return val(); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &operator*() & { ++ assert(has_value()); + return val(); + } + template ::value> * = nullptr> + constexpr const U &&operator*() const && { ++ assert(has_value()); + return std::move(val()); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &&operator*() && { ++ assert(has_value()); + return std::move(val()); + } + +@@ -1918,10 +1929,22 @@ + return std::move(val()); + } + +- constexpr const E &error() const & { return err().value(); } +- TL_EXPECTED_11_CONSTEXPR E &error() & { return err().value(); } +- constexpr const E &&error() const && { return std::move(err().value()); } +- TL_EXPECTED_11_CONSTEXPR E &&error() && { return std::move(err().value()); } ++ constexpr const E &error() const & { ++ assert(!has_value()); ++ return err().value(); ++ } ++ TL_EXPECTED_11_CONSTEXPR E &error() & { ++ assert(!has_value()); ++ return err().value(); ++ } ++ constexpr const E &&error() const && { ++ assert(!has_value()); ++ return std::move(err().value()); ++ } ++ TL_EXPECTED_11_CONSTEXPR E &&error() && { ++ assert(!has_value()); ++ return std::move(err().value()); ++ } + + template constexpr T value_or(U &&v) const & { + static_assert(std::is_copy_constructible::value &&