From d829b480781118f939c7728991e33da3edb6e2f3 Mon Sep 17 00:00:00 2001 From: Emil Dotchevski Date: Wed, 2 Sep 2020 15:05:34 -0700 Subject: [PATCH] Removed incorrect constexpr from result --- include/boost/leaf.hpp | 102 ++++++++++++++------------- include/boost/leaf/detail/config.hpp | 21 +++--- include/boost/leaf/detail/print.hpp | 2 + include/boost/leaf/exception.hpp | 1 + include/boost/leaf/result.hpp | 78 ++++++++++---------- test/match_member_test.cpp | 1 + test/match_test.cpp | 1 + test/match_value_test.cpp | 1 + test/multiple_errors_test.cpp | 1 + 9 files changed, 110 insertions(+), 98 deletions(-) diff --git a/include/boost/leaf.hpp b/include/boost/leaf.hpp index 552fb0e..5526e2a 100644 --- a/include/boost/leaf.hpp +++ b/include/boost/leaf.hpp @@ -532,8 +532,6 @@ namespace boost { namespace leaf { // (C) Copyright Martin Wille 2003. // (C) Copyright Guillaume Melquiond 2003. -#include - #ifndef BOOST_LEAF_ENABLE_WARNINGS # if defined(__clang__) # pragma clang system_header @@ -686,14 +684,6 @@ namespace boost { namespace leaf { //////////////////////////////////////// -#if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L) || (defined(_MSC_VER) && _MSC_VER >= 1900) -# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 1 -#else -# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 0 -#endif - -//////////////////////////////////////// - #ifndef BOOST_LEAF_ASSERT # ifdef BOOST_ASSERT # define BOOST_LEAF_ASSERT BOOST_ASSERT @@ -703,6 +693,17 @@ namespace boost { namespace leaf { # endif #endif +//////////////////////////////////////// + +#ifndef BOOST_LEAF_NO_EXCEPTIONS +# include +# if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L) || (defined(_MSC_VER) && _MSC_VER >= 1900) +# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 1 +# else +# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 0 +# endif +#endif + #endif // <<< #include #line 20 "boost/leaf/detail/optional.hpp" @@ -969,6 +970,7 @@ namespace boost { namespace leaf { } }; +#ifndef BOOST_LEAF_NO_EXCEPTIONS template <> struct diagnostic { @@ -977,6 +979,7 @@ namespace boost { namespace leaf { { } }; +#endif } } } @@ -1725,6 +1728,7 @@ namespace boost { namespace leaf { #endif // <<< #include #line 20 "boost/leaf/exception.hpp" +#include #define BOOST_LEAF_EXCEPTION ::boost::leaf::leaf_detail::inject_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::exception #define BOOST_LEAF_THROW_EXCEPTION ::boost::leaf::leaf_detail::throw_with_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::exception @@ -4336,30 +4340,30 @@ namespace boost { namespace leaf { val = 3 }; - BOOST_LEAF_CONSTEXPR explicit result_discriminant( error_id id ) noexcept: + explicit result_discriminant( error_id id ) noexcept: state_(id.value()) { BOOST_LEAF_ASSERT(state_==0 || (state_&3)==1); } struct kind_val { }; - BOOST_LEAF_CONSTEXPR explicit result_discriminant( kind_val ) noexcept: + explicit result_discriminant( kind_val ) noexcept: state_(val) { } struct kind_ctx_ptr { }; - BOOST_LEAF_CONSTEXPR explicit result_discriminant( kind_ctx_ptr ) noexcept: + explicit result_discriminant( kind_ctx_ptr ) noexcept: state_(ctx_ptr) { } - BOOST_LEAF_CONSTEXPR kind_t kind() const noexcept + kind_t kind() const noexcept { return kind_t(state_&3); } - BOOST_LEAF_CONSTEXPR error_id get_error_id() const noexcept + error_id get_error_id() const noexcept { BOOST_LEAF_ASSERT(kind()==no_error || kind()==err_id); return make_error_id(state_); @@ -4385,13 +4389,13 @@ namespace boost { namespace leaf { result & r_; - BOOST_LEAF_CONSTEXPR error_result( result & r ) noexcept: + error_result( result & r ) noexcept: r_(r) { } template - BOOST_LEAF_CONSTEXPR operator result() noexcept + operator result() noexcept { switch(r_.what_.kind()) { @@ -4404,7 +4408,7 @@ namespace boost { namespace leaf { } } - BOOST_LEAF_CONSTEXPR operator error_id() noexcept + operator error_id() noexcept { switch(r_.what_.kind()) { @@ -4434,7 +4438,7 @@ namespace boost { namespace leaf { result_discriminant what_; - BOOST_LEAF_CONSTEXPR void destroy() const noexcept + void destroy() const noexcept { switch(this->what_.kind()) { @@ -4450,7 +4454,7 @@ namespace boost { namespace leaf { } template - BOOST_LEAF_CONSTEXPR result_discriminant move_from( result && x ) noexcept + result_discriminant move_from( result && x ) noexcept { auto x_what = x.what_; switch(x_what.kind()) @@ -4467,13 +4471,13 @@ namespace boost { namespace leaf { return x_what; } - BOOST_LEAF_CONSTEXPR result( result_discriminant && what ) noexcept: + result( result_discriminant && what ) noexcept: what_(std::move(what)) { BOOST_LEAF_ASSERT(what_.kind()==result_discriminant::err_id || what_.kind()==result_discriminant::no_error); } - BOOST_LEAF_CONSTEXPR error_id get_error_id() const noexcept + error_id get_error_id() const noexcept { BOOST_LEAF_ASSERT(what_.kind()!=result_discriminant::val); return what_.kind()==result_discriminant::ctx_ptr ? ctx_->captured_id_ : what_.get_error_id(); @@ -4483,37 +4487,37 @@ namespace boost { namespace leaf { public: - BOOST_LEAF_CONSTEXPR result( result && x ) noexcept: + result( result && x ) noexcept: what_(move_from(std::move(x))) { } template - BOOST_LEAF_CONSTEXPR result( result && x ) noexcept: + result( result && x ) noexcept: what_(move_from(std::move(x))) { } - BOOST_LEAF_CONSTEXPR result(): + result(): stored_(stored_type()), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( value_type && v ) noexcept: + result( value_type && v ) noexcept: stored_(std::forward(v)), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( value_type_const & v ): + result( value_type_const & v ): stored_(v), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( error_id err ) noexcept: + result( error_id err ) noexcept: what_(err) { } @@ -4521,13 +4525,13 @@ namespace boost { namespace leaf { // SFINAE: T can be initialized with a U, e.g. result("literal"). // Not using is_constructible on purpose, bug with COMPILER=/usr/bin/clang++ CXXSTD=11 clang 3.3. template - BOOST_LEAF_CONSTEXPR result( U && u, decltype(init_T_with_U(std::forward(u))) * = 0 ): + result( U && u, decltype(init_T_with_U(std::forward(u))) * = 0 ): stored_(std::forward(u)), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( std::error_code const & ec ) noexcept: + result( std::error_code const & ec ) noexcept: what_(error_id(ec)) { } @@ -4538,7 +4542,7 @@ namespace boost { namespace leaf { { } - BOOST_LEAF_CONSTEXPR result( context_ptr && ctx ) noexcept: + result( context_ptr && ctx ) noexcept: ctx_(std::move(ctx)), what_(result_discriminant::kind_ctx_ptr{}) { @@ -4549,7 +4553,7 @@ namespace boost { namespace leaf { destroy(); } - BOOST_LEAF_CONSTEXPR result & operator=( result && x ) noexcept + result & operator=( result && x ) noexcept { destroy(); what_ = move_from(std::move(x)); @@ -4557,19 +4561,19 @@ namespace boost { namespace leaf { } template - BOOST_LEAF_CONSTEXPR result & operator=( result && x ) noexcept + result & operator=( result && x ) noexcept { destroy(); what_ = move_from(std::move(x)); return *this; } - BOOST_LEAF_CONSTEXPR explicit operator bool() const noexcept + explicit operator bool() const noexcept { return what_.kind() == result_discriminant::val; } - BOOST_LEAF_CONSTEXPR value_type_const & value() const + value_type_const & value() const { if( what_.kind() == result_discriminant::val ) return stored_; @@ -4577,7 +4581,7 @@ namespace boost { namespace leaf { ::boost::leaf::throw_exception(bad_result(get_error_id())); } - BOOST_LEAF_CONSTEXPR value_type & value() + value_type & value() { if( what_.kind() == result_discriminant::val ) return stored_; @@ -4585,33 +4589,33 @@ namespace boost { namespace leaf { ::boost::leaf::throw_exception(bad_result(get_error_id())); } - BOOST_LEAF_CONSTEXPR value_type_const & operator*() const + value_type_const & operator*() const { return value(); } - BOOST_LEAF_CONSTEXPR value_type & operator*() + value_type & operator*() { return value(); } - BOOST_LEAF_CONSTEXPR value_type_const * operator->() const + value_type_const * operator->() const { return &value(); } - BOOST_LEAF_CONSTEXPR value_type * operator->() + value_type * operator->() { return &value(); } - BOOST_LEAF_CONSTEXPR error_result error() noexcept + error_result error() noexcept { return error_result{*this}; } template - BOOST_LEAF_CONSTEXPR error_id load( Item && ... item ) noexcept + error_id load( Item && ... item ) noexcept { return error_id(error()).load(std::forward(item)...); } @@ -4635,7 +4639,7 @@ namespace boost { namespace leaf { template friend class result; - BOOST_LEAF_CONSTEXPR result( result_discriminant && what ) noexcept: + result( result_discriminant && what ) noexcept: base(std::move(what)) { } @@ -4644,21 +4648,21 @@ namespace boost { namespace leaf { using value_type = void; - BOOST_LEAF_CONSTEXPR result( result && x ) noexcept: + result( result && x ) noexcept: base(std::move(x)) { } - BOOST_LEAF_CONSTEXPR result() noexcept + result() noexcept { } - BOOST_LEAF_CONSTEXPR result( error_id err ) noexcept: + result( error_id err ) noexcept: base(err) { } - BOOST_LEAF_CONSTEXPR result( std::error_code const & ec ) noexcept: + result( std::error_code const & ec ) noexcept: base(ec) { } @@ -4669,7 +4673,7 @@ namespace boost { namespace leaf { { } - BOOST_LEAF_CONSTEXPR result( context_ptr && ctx ) noexcept: + result( context_ptr && ctx ) noexcept: base(std::move(ctx)) { } @@ -4678,7 +4682,7 @@ namespace boost { namespace leaf { { } - BOOST_LEAF_CONSTEXPR void value() const + void value() const { (void) base::value(); } diff --git a/include/boost/leaf/detail/config.hpp b/include/boost/leaf/detail/config.hpp index 4ad7bc3..367fab7 100644 --- a/include/boost/leaf/detail/config.hpp +++ b/include/boost/leaf/detail/config.hpp @@ -12,8 +12,6 @@ // (C) Copyright Martin Wille 2003. // (C) Copyright Guillaume Melquiond 2003. -#include - #ifndef BOOST_LEAF_ENABLE_WARNINGS # if defined(__clang__) # pragma clang system_header @@ -166,14 +164,6 @@ //////////////////////////////////////// -#if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L) || (defined(_MSC_VER) && _MSC_VER >= 1900) -# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 1 -#else -# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 0 -#endif - -//////////////////////////////////////// - #ifndef BOOST_LEAF_ASSERT # ifdef BOOST_ASSERT # define BOOST_LEAF_ASSERT BOOST_ASSERT @@ -183,4 +173,15 @@ # endif #endif +//////////////////////////////////////// + +#ifndef BOOST_LEAF_NO_EXCEPTIONS +# include +# if (defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L) || (defined(_MSC_VER) && _MSC_VER >= 1900) +# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 1 +# else +# define BOOST_LEAF_STD_UNCAUGHT_EXCEPTIONS 0 +# endif +#endif + #endif diff --git a/include/boost/leaf/detail/print.hpp b/include/boost/leaf/detail/print.hpp index 25cbb1c..66283f1 100644 --- a/include/boost/leaf/detail/print.hpp +++ b/include/boost/leaf/detail/print.hpp @@ -117,6 +117,7 @@ namespace boost { namespace leaf { } }; +#ifndef BOOST_LEAF_NO_EXCEPTIONS template <> struct diagnostic { @@ -125,6 +126,7 @@ namespace boost { namespace leaf { { } }; +#endif } } } diff --git a/include/boost/leaf/exception.hpp b/include/boost/leaf/exception.hpp index b63aed5..b71f432 100644 --- a/include/boost/leaf/exception.hpp +++ b/include/boost/leaf/exception.hpp @@ -17,6 +17,7 @@ #endif #include +#include #define BOOST_LEAF_EXCEPTION ::boost::leaf::leaf_detail::inject_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::exception #define BOOST_LEAF_THROW_EXCEPTION ::boost::leaf::leaf_detail::throw_with_loc{__FILE__,__LINE__,__FUNCTION__}+::boost::leaf::exception diff --git a/include/boost/leaf/result.hpp b/include/boost/leaf/result.hpp index 0fe2296..c40730a 100644 --- a/include/boost/leaf/result.hpp +++ b/include/boost/leaf/result.hpp @@ -74,30 +74,30 @@ namespace boost { namespace leaf { val = 3 }; - BOOST_LEAF_CONSTEXPR explicit result_discriminant( error_id id ) noexcept: + explicit result_discriminant( error_id id ) noexcept: state_(id.value()) { BOOST_LEAF_ASSERT(state_==0 || (state_&3)==1); } struct kind_val { }; - BOOST_LEAF_CONSTEXPR explicit result_discriminant( kind_val ) noexcept: + explicit result_discriminant( kind_val ) noexcept: state_(val) { } struct kind_ctx_ptr { }; - BOOST_LEAF_CONSTEXPR explicit result_discriminant( kind_ctx_ptr ) noexcept: + explicit result_discriminant( kind_ctx_ptr ) noexcept: state_(ctx_ptr) { } - BOOST_LEAF_CONSTEXPR kind_t kind() const noexcept + kind_t kind() const noexcept { return kind_t(state_&3); } - BOOST_LEAF_CONSTEXPR error_id get_error_id() const noexcept + error_id get_error_id() const noexcept { BOOST_LEAF_ASSERT(kind()==no_error || kind()==err_id); return make_error_id(state_); @@ -123,13 +123,13 @@ namespace boost { namespace leaf { result & r_; - BOOST_LEAF_CONSTEXPR error_result( result & r ) noexcept: + error_result( result & r ) noexcept: r_(r) { } template - BOOST_LEAF_CONSTEXPR operator result() noexcept + operator result() noexcept { switch(r_.what_.kind()) { @@ -142,7 +142,7 @@ namespace boost { namespace leaf { } } - BOOST_LEAF_CONSTEXPR operator error_id() noexcept + operator error_id() noexcept { switch(r_.what_.kind()) { @@ -172,7 +172,7 @@ namespace boost { namespace leaf { result_discriminant what_; - BOOST_LEAF_CONSTEXPR void destroy() const noexcept + void destroy() const noexcept { switch(this->what_.kind()) { @@ -188,7 +188,7 @@ namespace boost { namespace leaf { } template - BOOST_LEAF_CONSTEXPR result_discriminant move_from( result && x ) noexcept + result_discriminant move_from( result && x ) noexcept { auto x_what = x.what_; switch(x_what.kind()) @@ -205,13 +205,13 @@ namespace boost { namespace leaf { return x_what; } - BOOST_LEAF_CONSTEXPR result( result_discriminant && what ) noexcept: + result( result_discriminant && what ) noexcept: what_(std::move(what)) { BOOST_LEAF_ASSERT(what_.kind()==result_discriminant::err_id || what_.kind()==result_discriminant::no_error); } - BOOST_LEAF_CONSTEXPR error_id get_error_id() const noexcept + error_id get_error_id() const noexcept { BOOST_LEAF_ASSERT(what_.kind()!=result_discriminant::val); return what_.kind()==result_discriminant::ctx_ptr ? ctx_->captured_id_ : what_.get_error_id(); @@ -221,37 +221,37 @@ namespace boost { namespace leaf { public: - BOOST_LEAF_CONSTEXPR result( result && x ) noexcept: + result( result && x ) noexcept: what_(move_from(std::move(x))) { } template - BOOST_LEAF_CONSTEXPR result( result && x ) noexcept: + result( result && x ) noexcept: what_(move_from(std::move(x))) { } - BOOST_LEAF_CONSTEXPR result(): + result(): stored_(stored_type()), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( value_type && v ) noexcept: + result( value_type && v ) noexcept: stored_(std::forward(v)), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( value_type_const & v ): + result( value_type_const & v ): stored_(v), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( error_id err ) noexcept: + result( error_id err ) noexcept: what_(err) { } @@ -259,13 +259,13 @@ namespace boost { namespace leaf { // SFINAE: T can be initialized with a U, e.g. result("literal"). // Not using is_constructible on purpose, bug with COMPILER=/usr/bin/clang++ CXXSTD=11 clang 3.3. template - BOOST_LEAF_CONSTEXPR result( U && u, decltype(init_T_with_U(std::forward(u))) * = 0 ): + result( U && u, decltype(init_T_with_U(std::forward(u))) * = 0 ): stored_(std::forward(u)), what_(result_discriminant::kind_val{}) { } - BOOST_LEAF_CONSTEXPR result( std::error_code const & ec ) noexcept: + result( std::error_code const & ec ) noexcept: what_(error_id(ec)) { } @@ -276,7 +276,7 @@ namespace boost { namespace leaf { { } - BOOST_LEAF_CONSTEXPR result( context_ptr && ctx ) noexcept: + result( context_ptr && ctx ) noexcept: ctx_(std::move(ctx)), what_(result_discriminant::kind_ctx_ptr{}) { @@ -287,7 +287,7 @@ namespace boost { namespace leaf { destroy(); } - BOOST_LEAF_CONSTEXPR result & operator=( result && x ) noexcept + result & operator=( result && x ) noexcept { destroy(); what_ = move_from(std::move(x)); @@ -295,19 +295,19 @@ namespace boost { namespace leaf { } template - BOOST_LEAF_CONSTEXPR result & operator=( result && x ) noexcept + result & operator=( result && x ) noexcept { destroy(); what_ = move_from(std::move(x)); return *this; } - BOOST_LEAF_CONSTEXPR explicit operator bool() const noexcept + explicit operator bool() const noexcept { return what_.kind() == result_discriminant::val; } - BOOST_LEAF_CONSTEXPR value_type_const & value() const + value_type_const & value() const { if( what_.kind() == result_discriminant::val ) return stored_; @@ -315,7 +315,7 @@ namespace boost { namespace leaf { ::boost::leaf::throw_exception(bad_result(get_error_id())); } - BOOST_LEAF_CONSTEXPR value_type & value() + value_type & value() { if( what_.kind() == result_discriminant::val ) return stored_; @@ -323,33 +323,33 @@ namespace boost { namespace leaf { ::boost::leaf::throw_exception(bad_result(get_error_id())); } - BOOST_LEAF_CONSTEXPR value_type_const & operator*() const + value_type_const & operator*() const { return value(); } - BOOST_LEAF_CONSTEXPR value_type & operator*() + value_type & operator*() { return value(); } - BOOST_LEAF_CONSTEXPR value_type_const * operator->() const + value_type_const * operator->() const { return &value(); } - BOOST_LEAF_CONSTEXPR value_type * operator->() + value_type * operator->() { return &value(); } - BOOST_LEAF_CONSTEXPR error_result error() noexcept + error_result error() noexcept { return error_result{*this}; } template - BOOST_LEAF_CONSTEXPR error_id load( Item && ... item ) noexcept + error_id load( Item && ... item ) noexcept { return error_id(error()).load(std::forward(item)...); } @@ -373,7 +373,7 @@ namespace boost { namespace leaf { template friend class result; - BOOST_LEAF_CONSTEXPR result( result_discriminant && what ) noexcept: + result( result_discriminant && what ) noexcept: base(std::move(what)) { } @@ -382,21 +382,21 @@ namespace boost { namespace leaf { using value_type = void; - BOOST_LEAF_CONSTEXPR result( result && x ) noexcept: + result( result && x ) noexcept: base(std::move(x)) { } - BOOST_LEAF_CONSTEXPR result() noexcept + result() noexcept { } - BOOST_LEAF_CONSTEXPR result( error_id err ) noexcept: + result( error_id err ) noexcept: base(err) { } - BOOST_LEAF_CONSTEXPR result( std::error_code const & ec ) noexcept: + result( std::error_code const & ec ) noexcept: base(ec) { } @@ -407,7 +407,7 @@ namespace boost { namespace leaf { { } - BOOST_LEAF_CONSTEXPR result( context_ptr && ctx ) noexcept: + result( context_ptr && ctx ) noexcept: base(std::move(ctx)) { } @@ -416,7 +416,7 @@ namespace boost { namespace leaf { { } - BOOST_LEAF_CONSTEXPR void value() const + void value() const { (void) base::value(); } diff --git a/test/match_member_test.cpp b/test/match_member_test.cpp index d7d1abf..7563e62 100644 --- a/test/match_member_test.cpp +++ b/test/match_member_test.cpp @@ -18,6 +18,7 @@ int main() #include #include #include +#include #include "_test_ec.hpp" #include "lightweight_test.hpp" diff --git a/test/match_test.cpp b/test/match_test.cpp index d05a1c3..4835dbc 100644 --- a/test/match_test.cpp +++ b/test/match_test.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "_test_ec.hpp" #include "lightweight_test.hpp" diff --git a/test/match_value_test.cpp b/test/match_value_test.cpp index f5e5452..cc3cb9b 100644 --- a/test/match_value_test.cpp +++ b/test/match_value_test.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "_test_ec.hpp" #include "lightweight_test.hpp" diff --git a/test/multiple_errors_test.cpp b/test/multiple_errors_test.cpp index b36af89..665d487 100644 --- a/test/multiple_errors_test.cpp +++ b/test/multiple_errors_test.cpp @@ -7,6 +7,7 @@ #include #include +#include #include "lightweight_test.hpp" namespace leaf = boost::leaf;