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
This commit is contained in:
parent
dce15db61b
commit
fd231ad75a
4 changed files with 30 additions and 21 deletions
|
@ -1,3 +1,15 @@
|
|||
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>
|
||||
|
||||
Implement LWG 2934, optional<const T> doesn't compare with T.
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
||||
|
|
|
@ -37,8 +37,8 @@ int main()
|
|||
std::optional<std::unique_ptr<int>> oup2 = new int; // { dg-error "conversion" }
|
||||
struct U { explicit U(std::in_place_t); };
|
||||
std::optional<U> 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 }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<std::logic_error, check4_t>::value,
|
||||
"bad_optional_access must derive from logic_error");
|
||||
static_assert(!std::is_base_of<std::logic_error, check4_t>::value,
|
||||
"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");
|
||||
|
|
Loading…
Add table
Reference in a new issue