This simplifies the conditions of some static assertions, using one assertion per condition instead of asserting the conjunction. This means we don't need any string literal, because the conditions are quite readable now.
* include/std/optional: Use a separate static_assert per condition. * testsuite/20_util/optional/cons/value_neg.cc: Update dg-error line numbers. Tested powerpc64le-linux, committed to trunk.
commit 90daca5d8383567deaff9817c4cca92309573311 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon May 8 16:23:44 2017 +0100 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. diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index 1724120..5aa926f 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_<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()) 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 87907f9..5abe26e 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<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 } } }