From a610249b9ea7c414810b1c0a12f9a81c13c834ec Mon Sep 17 00:00:00 2001 From: Eric Niebler Date: Thu, 15 Sep 2016 17:00:30 -0700 Subject: [PATCH] work around LLVM#30305 in folly::Expected, use unified initialization syntax for extra goodness Summary: The behavior of inheriting constructors changed in clang 3.9 (see https://llvm.org/bugs/show_bug.cgi?id=30305), and folly::Expected needs to change accordingly. As a drive-by improvement, change all invocations of default constructors to use unified initialization syntax. Reviewed By: igorsugak Differential Revision: D3872994 fbshipit-source-id: fdaea8b35980df21b8522e2c3d5a8c3be1d84efa --- folly/Expected.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/folly/Expected.h b/folly/Expected.h index 0bf217c7..3de0a6d9 100644 --- a/folly/Expected.h +++ b/folly/Expected.h @@ -181,11 +181,11 @@ struct ExpectedStorage { }; Which which_; - template - constexpr ExpectedStorage() noexcept(noexcept(E())) - : error_(), which_(Which::eError) {} + template + constexpr ExpectedStorage() noexcept(noexcept(E{})) + : error_{}, which_(Which::eError) {} explicit constexpr ExpectedStorage(EmptyTag) noexcept - : ch_(), which_(Which::eEmpty) {} + : ch_{}, which_(Which::eEmpty) {} template explicit constexpr ExpectedStorage(ValueTag, Vs&&... vs) noexcept( noexcept(Value(static_cast(vs)...))) @@ -253,8 +253,8 @@ struct ExpectedUnion { }; Which which_; - explicit constexpr ExpectedUnion(EmptyTag = {}) noexcept - : ch_(), which_(Which::eEmpty) {} + explicit constexpr ExpectedUnion(EmptyTag) noexcept + : ch_{}, which_(Which::eEmpty) {} template explicit constexpr ExpectedUnion(ValueTag, Vs&&... vs) noexcept( noexcept(Value(static_cast(vs)...))) @@ -396,8 +396,8 @@ struct ExpectedStorage using value_type = Value; using error_type = Error; using Base = ExpectedUnion; - template - constexpr ExpectedStorage() noexcept(noexcept(E())) : Base{ErrorTag{}} {} + template + constexpr ExpectedStorage() noexcept(noexcept(E{})) : Base{ErrorTag{}} {} ExpectedStorage(const ExpectedStorage&) = default; ExpectedStorage(ExpectedStorage&&) = default; ExpectedStorage& operator=(const ExpectedStorage&) = default; @@ -480,17 +480,17 @@ struct ExpectedStorage { Value value_; constexpr ExpectedStorage() noexcept - : which_(Which::eError), error_(), value_() {} + : which_(Which::eError), error_{}, value_{} {} explicit constexpr ExpectedStorage(EmptyTag) noexcept - : which_(Which::eEmpty), error_(), value_() {} + : which_(Which::eEmpty), error_{}, value_{} {} template explicit constexpr ExpectedStorage(ValueTag, Vs&&... vs) noexcept( noexcept(Value(static_cast(vs)...))) - : which_(Which::eValue), error_(), value_(static_cast(vs)...) {} + : which_(Which::eValue), error_{}, value_(static_cast(vs)...) {} template explicit constexpr ExpectedStorage(ErrorTag, Es&&... es) noexcept( noexcept(Error(static_cast(es)...))) - : which_(Which::eError), error_(static_cast(es)...), value_() {} + : which_(Which::eError), error_(static_cast(es)...), value_{} {} void clear() noexcept {} constexpr static bool uninitializedByException() noexcept { return false; @@ -661,7 +661,7 @@ class Unexpected final { class BadExpectedAccess : public folly::BadExpectedAccess { public: explicit BadExpectedAccess(Error err) - : folly::BadExpectedAccess(), error_(std::move(err)) {} + : folly::BadExpectedAccess{}, error_(std::move(err)) {} /** * The error code that was held by the Expected object when the user * erroneously requested the value. @@ -892,7 +892,7 @@ class Expected final : expected_detail::ExpectedStorage { * Constructors */ template - Expected() noexcept(noexcept(B{})) : Base() {} + Expected() noexcept(noexcept(B{})) : Base{} {} Expected(const Expected& that) = default; Expected(Expected&& that) = default; @@ -1198,7 +1198,7 @@ class Expected final : expected_detail::ExpectedStorage { * thenOrThrow */ template - auto thenOrThrow(Yes&& yes, No&& no = No()) const& -> decltype( + auto thenOrThrow(Yes&& yes, No&& no = No{}) const& -> decltype( std::declval()(std::declval())) { using Ret = decltype(std::declval()(std::declval())); if (this->uninitializedByException()) @@ -1208,7 +1208,7 @@ class Expected final : expected_detail::ExpectedStorage { } template - auto thenOrThrow(Yes&& yes, No&& no = No()) & -> decltype( + auto thenOrThrow(Yes&& yes, No&& no = No{}) & -> decltype( std::declval()(std::declval())) { using Ret = decltype(std::declval()(std::declval())); if (this->uninitializedByException()) @@ -1218,7 +1218,7 @@ class Expected final : expected_detail::ExpectedStorage { } template - auto thenOrThrow(Yes&& yes, No&& no = No()) && -> decltype( + auto thenOrThrow(Yes&& yes, No&& no = No{}) && -> decltype( std::declval()(std::declval())) { using Ret = decltype(std::declval()(std::declval())); if (this->uninitializedByException()) -- 2.34.1