From 497d987dcafcef11224e9e027b9479a20dd01702 Mon Sep 17 00:00:00 2001 From: redi Date: Mon, 8 May 2017 17:13:38 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@247748 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 4 ++++ libstdc++-v3/include/std/optional | 17 +++++++---------- .../testsuite/20_util/optional/cons/value_neg.cc | 6 +++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b5a67190e79..f2859399266 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2017-05-08 Jonathan Wakely + * 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. diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index 17241204abb..5aa926f0cfd 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -462,10 +462,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Unique tag type. optional<_Tp>> { - static_assert(__and_<__not_, nullopt_t>>, - __not_, in_place_t>>, - __not_>>(), - "Invalid instantiation of optional"); + static_assert(!is_same_v, nullopt_t>); + static_assert(!is_same_v, 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_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_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()) 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 87907f96d13..5abe26e433d 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 { *-*-* } } 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 } } } -- 2.11.4.GIT