Tweak static assertions in std::optional

* include/std/optional: Use a separate static_assert per condition.
	* testsuite/20_util/optional/cons/value_neg.cc: Update dg-error line
	numbers.

From-SVN: r247748
This commit is contained in:
Jonathan Wakely 2017-05-08 18:13:38 +01:00 committed by Jonathan Wakely
parent 7574e45845
commit 9057edd30c
3 changed files with 14 additions and 13 deletions

View file

@ -1,5 +1,9 @@
2017-05-08 Jonathan Wakely <jwakely@redhat.com>
* include/std/optional: Use a separate static_assert per condition.
* testsuite/20_util/optional/cons/value_neg.cc: Update dg-error line
numbers.
* doc/xml/manual/mt_allocator.xml: Clarify deallocation behaviour.
* doc/html/*: Regenerate.

View file

@ -462,10 +462,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Unique tag type.
optional<_Tp>>
{
static_assert(__and_<__not_<is_same<remove_cv_t<_Tp>, nullopt_t>>,
__not_<is_same<remove_cv_t<_Tp>, in_place_t>>,
__not_<is_reference<_Tp>>>(),
"Invalid instantiation of optional<T>");
static_assert(!is_same_v<remove_cv_t<_Tp>, nullopt_t>);
static_assert(!is_same_v<remove_cv_t<_Tp>, in_place_t>);
static_assert(!is_reference_v<_Tp>);
private:
using _Base = _Optional_base<_Tp>;
@ -756,9 +755,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr _Tp
value_or(_Up&& __u) const&
{
static_assert(__and_<is_copy_constructible<_Tp>,
is_convertible<_Up&&, _Tp>>(),
"Cannot return value");
static_assert(is_copy_constructible_v<_Tp>);
static_assert(is_convertible_v<_Up&&, _Tp>);
return this->_M_is_engaged()
? this->_M_get()
@ -769,9 +767,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Tp
value_or(_Up&& __u) &&
{
static_assert(__and_<is_move_constructible<_Tp>,
is_convertible<_Up&&, _Tp>>(),
"Cannot return value" );
static_assert(is_move_constructible_v<_Tp>);
static_assert(is_convertible_v<_Up&&, _Tp>);
return this->_M_is_engaged()
? std::move(this->_M_get())

View file

@ -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 { *-*-* } } 488 }
// { dg-error "no type" "" { target { *-*-* } } 498 }
// { dg-error "no type" "" { target { *-*-* } } 555 }
// { dg-error "no type" "" { target { *-*-* } } 487 }
// { dg-error "no type" "" { target { *-*-* } } 497 }
// { dg-error "no type" "" { target { *-*-* } } 554 }
}
}