libstdc++: Make copyable-box completely constexpr (LWG 3572)
This LWG issue was approved at the October 2021 plenary and can be implemented now that std::optional is fully constexpr. libstdc++-v3/ChangeLog: * include/std/ranges (ranges::__detail::__box): Add constexpr to assignment operators (LWG 3572). * testsuite/std/ranges/adaptors/filter.cc: Check assignment of a view that uses copyable-box.
This commit is contained in:
parent
06bc1b0c53
commit
d2dc5305d8
@ -109,7 +109,8 @@ namespace ranges
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 3477. Simplify constraints for semiregular-box
|
||||
__box&
|
||||
// 3572. copyable-box should be fully constexpr
|
||||
constexpr __box&
|
||||
operator=(const __box& __that)
|
||||
noexcept(is_nothrow_copy_constructible_v<_Tp>)
|
||||
requires (!copyable<_Tp>)
|
||||
@ -124,7 +125,7 @@ namespace ranges
|
||||
return *this;
|
||||
}
|
||||
|
||||
__box&
|
||||
constexpr __box&
|
||||
operator=(__box&& __that)
|
||||
noexcept(is_nothrow_move_constructible_v<_Tp>)
|
||||
requires (!movable<_Tp>)
|
||||
|
@ -140,6 +140,33 @@ test06()
|
||||
static_assert(!requires { views::all | filter; });
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
test07()
|
||||
{
|
||||
struct Pred
|
||||
{
|
||||
constexpr Pred() { }
|
||||
constexpr Pred(const Pred&) { }
|
||||
constexpr Pred(Pred&&) { }
|
||||
// These make it non-copyable, so non-copyable-box<Pred> will provide
|
||||
// assignment.
|
||||
Pred& operator=(const Pred&) = delete;
|
||||
Pred& operator=(Pred&&) = delete;
|
||||
|
||||
bool operator()(int i) const { return i < 10; }
|
||||
};
|
||||
|
||||
int i = 0;
|
||||
ranges::filter_view v(views::single(i), Pred{});
|
||||
// LWG 3572. copyable-box should be fully constexpr
|
||||
v = v;
|
||||
v = std::move(v);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static_assert( test07() );
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
@ -150,4 +177,5 @@ main()
|
||||
test05<forward_iterator_wrapper>();
|
||||
test05<random_access_iterator_wrapper>();
|
||||
test06();
|
||||
test07();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user