Commit fd231ad7 by Ville Voutilainen Committed by 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.

From-SVN: r246103
parent dce15db6
2017-03-13 Ville Voutilainen <ville.voutilainen@gmail.com>
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 <ville.voutilainen@gmail.com> 2017-03-12 Ville Voutilainen <ville.voutilainen@gmail.com>
Implement LWG 2934, optional<const T> doesn't compare with T. Implement LWG 2934, optional<const T> doesn't compare with T.
......
...@@ -76,25 +76,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -76,25 +76,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* dereferenced. * dereferenced.
* @ingroup exceptions * @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: public:
bad_optional_access() : logic_error("bad optional access") { } bad_optional_access() { }
// XXX This constructor is non-standard. Should not be inline virtual const char* what() const noexcept override
explicit bad_optional_access(const char* __arg) : logic_error(__arg) { } {return "bad optional access";}
virtual ~bad_optional_access() noexcept = default; virtual ~bad_optional_access() noexcept = default;
}; };
void void
__throw_bad_optional_access(const char*) __throw_bad_optional_access()
__attribute__((__noreturn__)); __attribute__((__noreturn__));
// XXX Does not belong here. // XXX Does not belong here.
inline void inline void
__throw_bad_optional_access(const char* __s) __throw_bad_optional_access()
{ _GLIBCXX_THROW_OR_ABORT(bad_optional_access(__s)); } { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); }
/** /**
* @brief Class template that holds the necessary state for @ref optional * @brief Class template that holds the necessary state for @ref optional
...@@ -669,8 +668,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -669,8 +668,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
return this->_M_is_engaged() return this->_M_is_engaged()
? this->_M_get() ? this->_M_get()
: (__throw_bad_optional_access("Attempt to access value of a " : (__throw_bad_optional_access(),
"disengaged optional object"),
this->_M_get()); this->_M_get());
} }
...@@ -679,8 +677,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -679,8 +677,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
return this->_M_is_engaged() return this->_M_is_engaged()
? this->_M_get() ? this->_M_get()
: (__throw_bad_optional_access("Attempt to access value of a " : (__throw_bad_optional_access(),
"disengaged optional object"),
this->_M_get()); this->_M_get());
} }
...@@ -689,8 +686,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -689,8 +686,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
return this->_M_is_engaged() return this->_M_is_engaged()
? std::move(this->_M_get()) ? std::move(this->_M_get())
: (__throw_bad_optional_access("Attempt to access value of a " : (__throw_bad_optional_access(),
"disengaged optional object"),
std::move(this->_M_get())); std::move(this->_M_get()));
} }
...@@ -699,8 +695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -699,8 +695,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
return this->_M_is_engaged() return this->_M_is_engaged()
? std::move(this->_M_get()) ? std::move(this->_M_get())
: (__throw_bad_optional_access("Attempt to access value of a " : (__throw_bad_optional_access(),
"disengaged optional object"),
std::move(this->_M_get())); std::move(this->_M_get()));
} }
......
...@@ -37,8 +37,8 @@ int main() ...@@ -37,8 +37,8 @@ int main()
std::optional<std::unique_ptr<int>> oup2 = new int; // { dg-error "conversion" } std::optional<std::unique_ptr<int>> oup2 = new int; // { dg-error "conversion" }
struct U { explicit U(std::in_place_t); }; struct U { explicit U(std::in_place_t); };
std::optional<U> ou(std::in_place); // { dg-error "no matching" } std::optional<U> ou(std::in_place); // { dg-error "no matching" }
// { dg-error "no type" "" { target { *-*-* } } 438 } // { dg-error "no type" "" { target { *-*-* } } 437 }
// { dg-error "no type" "" { target { *-*-* } } 448 } // { dg-error "no type" "" { target { *-*-* } } 447 }
// { dg-error "no type" "" { target { *-*-* } } 505 } // { dg-error "no type" "" { target { *-*-* } } 504 }
} }
} }
...@@ -29,5 +29,7 @@ using check2_t = std::in_place_t; ...@@ -29,5 +29,7 @@ using check2_t = std::in_place_t;
using check3_t = std::nullopt_t; using check3_t = std::nullopt_t;
using check4_t = std::bad_optional_access; using check4_t = std::bad_optional_access;
static_assert(std::is_base_of<std::logic_error, check4_t>::value, static_assert(!std::is_base_of<std::logic_error, check4_t>::value,
"bad_optional_access must derive from logic_error"); "bad_optional_access must derive from exception");
static_assert(std::is_base_of<std::exception, check4_t>::value,
"bad_optional_access must derive from exception");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment