From fd231ad75a03bea9e7ac61c57f806740abddcab2 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Mon, 13 Mar 2017 20:03:30 +0200 Subject: [PATCH] Implement LWG 2806, Base class of bad_optional_access. * include/std/optional (bad_optional_access): Derive from std::exception. (bad_optional_access::bad_optional_access): Adjust. (bad_optional_access::what): New. (__throw_bad_optional_access(const char*)): Remove the parameter and adjust calls. * testsuite/20_util/optional/cons/value_neg.cc: Adjust. * testsuite/20_util/optional/typedefs.cc: Likewise. From-SVN: r246103 --- libstdc++-v3/ChangeLog | 12 +++++++++ libstdc++-v3/include/std/optional | 27 ++++++++----------- .../20_util/optional/cons/value_neg.cc | 6 ++--- .../testsuite/20_util/optional/typedefs.cc | 6 +++-- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 520c05c3e0b..c85d6a78d56 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2017-03-13 Ville Voutilainen + + Implement LWG 2806, Base class of bad_optional_access. + * include/std/optional (bad_optional_access): + Derive from std::exception. + (bad_optional_access::bad_optional_access): Adjust. + (bad_optional_access::what): New. + (__throw_bad_optional_access(const char*)): + Remove the parameter and adjust calls. + * testsuite/20_util/optional/cons/value_neg.cc: Adjust. + * testsuite/20_util/optional/typedefs.cc: Likewise. + 2017-03-12 Ville Voutilainen Implement LWG 2934, optional doesn't compare with T. diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index c7005152017..5e796ac504d 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -76,25 +76,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * dereferenced. * @ingroup exceptions */ - class bad_optional_access : public logic_error + class bad_optional_access : public exception { - // XXX See LEWG 72, https://issues.isocpp.org/show_bug.cgi?id=72 public: - bad_optional_access() : logic_error("bad optional access") { } - // XXX This constructor is non-standard. Should not be inline - explicit bad_optional_access(const char* __arg) : logic_error(__arg) { } + bad_optional_access() { } + virtual const char* what() const noexcept override + {return "bad optional access";} virtual ~bad_optional_access() noexcept = default; }; void - __throw_bad_optional_access(const char*) + __throw_bad_optional_access() __attribute__((__noreturn__)); // XXX Does not belong here. inline void - __throw_bad_optional_access(const char* __s) - { _GLIBCXX_THROW_OR_ABORT(bad_optional_access(__s)); } + __throw_bad_optional_access() + { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); } /** * @brief Class template that holds the necessary state for @ref optional @@ -669,8 +668,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return this->_M_is_engaged() ? this->_M_get() - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), + : (__throw_bad_optional_access(), this->_M_get()); } @@ -679,8 +677,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return this->_M_is_engaged() ? this->_M_get() - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), + : (__throw_bad_optional_access(), this->_M_get()); } @@ -689,8 +686,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return this->_M_is_engaged() ? std::move(this->_M_get()) - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), + : (__throw_bad_optional_access(), std::move(this->_M_get())); } @@ -699,8 +695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return this->_M_is_engaged() ? std::move(this->_M_get()) - : (__throw_bad_optional_access("Attempt to access value of a " - "disengaged optional object"), + : (__throw_bad_optional_access(), std::move(this->_M_get())); } diff --git a/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc b/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc index c1d652fa5aa..249f622919b 100644 --- a/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc +++ b/libstdc++-v3/testsuite/20_util/optional/cons/value_neg.cc @@ -37,8 +37,8 @@ int main() std::optional> oup2 = new int; // { dg-error "conversion" } struct U { explicit U(std::in_place_t); }; std::optional ou(std::in_place); // { dg-error "no matching" } - // { dg-error "no type" "" { target { *-*-* } } 438 } - // { dg-error "no type" "" { target { *-*-* } } 448 } - // { dg-error "no type" "" { target { *-*-* } } 505 } + // { dg-error "no type" "" { target { *-*-* } } 437 } + // { dg-error "no type" "" { target { *-*-* } } 447 } + // { dg-error "no type" "" { target { *-*-* } } 504 } } } diff --git a/libstdc++-v3/testsuite/20_util/optional/typedefs.cc b/libstdc++-v3/testsuite/20_util/optional/typedefs.cc index 01b76e8e7b8..8d3f997cef4 100644 --- a/libstdc++-v3/testsuite/20_util/optional/typedefs.cc +++ b/libstdc++-v3/testsuite/20_util/optional/typedefs.cc @@ -29,5 +29,7 @@ using check2_t = std::in_place_t; using check3_t = std::nullopt_t; using check4_t = std::bad_optional_access; -static_assert(std::is_base_of::value, - "bad_optional_access must derive from logic_error"); +static_assert(!std::is_base_of::value, + "bad_optional_access must derive from exception"); +static_assert(std::is_base_of::value, + "bad_optional_access must derive from exception"); -- 2.30.2