From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id C0BC8398304B; Tue, 27 Jul 2021 20:36:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C0BC8398304B MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-2543] libstdc++: Simplify std::optional::value() X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: b7195fb01fe62a313ae5f7faede698101bdb3025 X-Git-Newrev: 9360d6cd1706882dfffd3c7a08b5956c37207a11 Message-Id: <20210727203610.C0BC8398304B@sourceware.org> Date: Tue, 27 Jul 2021 20:36:10 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Jul 2021 20:36:10 -0000 https://gcc.gnu.org/g:9360d6cd1706882dfffd3c7a08b5956c37207a11 commit r12-2543-g9360d6cd1706882dfffd3c7a08b5956c37207a11 Author: Jonathan Wakely Date: Tue Jul 27 14:50:28 2021 +0100 libstdc++: Simplify std::optional::value() The structure of these functions likely dates from the time before G++ fully supported C++14 extended constexpr, so that the throw expression had to be the operand of a conditional expression. That is not true now, so we can use a more straightforward version of the code. We can also simplify the declaration of __throw_bad_optional_access by using the C++11-style [[noreturn]] attribute so that a separate declaration isn't needed. libstdc++-v3/ChangeLog: * include/experimental/optional (__throw_bad_optional_access): Replace GNU attribute with C++11 attribute. (optional::value, optional::value_or): Use if statements instead of conditional expressions. * include/std/optional (__throw_bad_optional_access) (optional::value, optional::value_or): Likewise. Diff: --- libstdc++-v3/include/experimental/optional | 56 +++++++++++++----------------- libstdc++-v3/include/std/optional | 43 +++++++++++------------ 2 files changed, 46 insertions(+), 53 deletions(-) diff --git a/libstdc++-v3/include/experimental/optional b/libstdc++-v3/include/experimental/optional index 431d23631cf..274c974853d 100644 --- a/libstdc++-v3/include/experimental/optional +++ b/libstdc++-v3/include/experimental/optional @@ -114,12 +114,8 @@ inline namespace fundamentals_v1 /// @cond undocumented - void - __throw_bad_optional_access(const char*) - __attribute__((__noreturn__)); - // XXX Does not belong here. - inline void + [[noreturn]] inline void __throw_bad_optional_access(const char* __s) { _GLIBCXX_THROW_OR_ABORT(bad_optional_access(__s)); } @@ -674,41 +670,37 @@ inline namespace fundamentals_v1 constexpr const _Tp& value() const& { - return this->_M_is_engaged() - ? this->_M_get() - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), - this->_M_get()); + if (this->_M_is_engaged()) + return this->_M_get(); + __throw_bad_optional_access("Attempt to access value of a " + "disengaged optional object"); } constexpr _Tp& value()& { - return this->_M_is_engaged() - ? this->_M_get() - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), - this->_M_get()); + if (this->_M_is_engaged()) + return this->_M_get(); + __throw_bad_optional_access("Attempt to access value of a " + "disengaged optional object"); } constexpr _Tp&& value()&& { - return this->_M_is_engaged() - ? std::move(this->_M_get()) - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), - std::move(this->_M_get())); + if (this->_M_is_engaged()) + return std::move(this->_M_get()); + __throw_bad_optional_access("Attempt to access value of a " + "disengaged optional object"); } constexpr const _Tp&& value() const&& { - return this->_M_is_engaged() - ? std::move(this->_M_get()) - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), - std::move(this->_M_get())); + if (this->_M_is_engaged()) + return std::move(this->_M_get()); + __throw_bad_optional_access("Attempt to access value of a " + "disengaged optional object"); } template @@ -719,9 +711,10 @@ inline namespace fundamentals_v1 is_convertible<_Up&&, _Tp>>(), "Cannot return value"); - return this->_M_is_engaged() - ? this->_M_get() - : static_cast<_Tp>(std::forward<_Up>(__u)); + if (this->_M_is_engaged()) + return this->_M_get(); + else + return static_cast<_Tp>(std::forward<_Up>(__u)); } template @@ -732,9 +725,10 @@ inline namespace fundamentals_v1 is_convertible<_Up&&, _Tp>>(), "Cannot return value" ); - return this->_M_is_engaged() - ? std::move(this->_M_get()) - : static_cast<_Tp>(std::forward<_Up>(__u)); + if (this->_M_is_engaged()) + return std::move(this->_M_get()); + else + return static_cast<_Tp>(std::forward<_Up>(__u)); } }; diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index df9ed0736b3..b8ab7510757 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -91,12 +91,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return "bad optional access"; } }; - void - __throw_bad_optional_access() - __attribute__((__noreturn__)); - // XXX Does not belong here. - inline void + [[__noreturn__]] inline void __throw_bad_optional_access() { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); } @@ -943,33 +939,33 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr const _Tp& value() const& { - return this->_M_is_engaged() - ? this->_M_get() - : (__throw_bad_optional_access(), this->_M_get()); + if (this->_M_is_engaged()) + return this->_M_get(); + __throw_bad_optional_access(); } constexpr _Tp& value()& { - return this->_M_is_engaged() - ? this->_M_get() - : (__throw_bad_optional_access(), this->_M_get()); + if (this->_M_is_engaged()) + return this->_M_get(); + __throw_bad_optional_access(); } constexpr _Tp&& value()&& { - return this->_M_is_engaged() - ? std::move(this->_M_get()) - : (__throw_bad_optional_access(), std::move(this->_M_get())); + if (this->_M_is_engaged()) + return std::move(this->_M_get()); + __throw_bad_optional_access(); } constexpr const _Tp&& value() const&& { - return this->_M_is_engaged() - ? std::move(this->_M_get()) - : (__throw_bad_optional_access(), std::move(this->_M_get())); + if (this->_M_is_engaged()) + return std::move(this->_M_get()); + __throw_bad_optional_access(); } template @@ -979,8 +975,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_assert(is_copy_constructible_v<_Tp>); static_assert(is_convertible_v<_Up&&, _Tp>); - return this->_M_is_engaged() - ? this->_M_get() : static_cast<_Tp>(std::forward<_Up>(__u)); + if (this->_M_is_engaged()) + return this->_M_get(); + else + return static_cast<_Tp>(std::forward<_Up>(__u)); } template @@ -990,9 +988,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static_assert(is_move_constructible_v<_Tp>); static_assert(is_convertible_v<_Up&&, _Tp>); - return this->_M_is_engaged() - ? std::move(this->_M_get()) - : static_cast<_Tp>(std::forward<_Up>(__u)); + if (this->_M_is_engaged()) + return std::move(this->_M_get()); + else + return static_cast<_Tp>(std::forward<_Up>(__u)); } void reset() noexcept { this->_M_reset(); }