libstdc++: Allow std::ranges::to to create unions
LWG 4229 points out that the std::ranges::to wording refers to class types, but I added an assertion using std::is_class_v which only allows non-union class types. LWG consensus is that unions should be allowed, so this additionally uses std::is_union_v. libstdc++-v3/ChangeLog: * include/std/ranges (ranges::to): Allow unions as well as non-union class types. * testsuite/std/ranges/conv/lwg4229.cc: New test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
This commit is contained in:
parent
e200f53a55
commit
479a0a8644
2 changed files with 20 additions and 2 deletions
|
@ -9421,7 +9421,7 @@ namespace __detail
|
|||
to [[nodiscard]] (_Rg&& __r, _Args&&... __args)
|
||||
{
|
||||
static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
|
||||
static_assert(is_class_v<_Cont>);
|
||||
static_assert(is_class_v<_Cont> || is_union_v<_Cont>);
|
||||
|
||||
if constexpr (__detail::__toable<_Cont, _Rg>)
|
||||
{
|
||||
|
@ -9580,7 +9580,7 @@ namespace __detail
|
|||
to [[nodiscard]] (_Args&&... __args)
|
||||
{
|
||||
static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
|
||||
static_assert(is_class_v<_Cont>);
|
||||
static_assert(is_class_v<_Cont> || is_union_v<_Cont>);
|
||||
|
||||
using __detail::_To;
|
||||
using views::__adaptor::_Partial;
|
||||
|
|
18
libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc
Normal file
18
libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc
Normal file
|
@ -0,0 +1,18 @@
|
|||
// { dg-do compile { target c++23 } }
|
||||
|
||||
// LWG 4229 std::ranges::to with union return type
|
||||
|
||||
#include <ranges>
|
||||
|
||||
union U
|
||||
{
|
||||
template<std::ranges::input_range R> U(std::from_range_t, R&&) { }
|
||||
|
||||
int i;
|
||||
};
|
||||
|
||||
void
|
||||
test_lwg4229(std::ranges::subrange<int*> r)
|
||||
{
|
||||
U u = std::ranges::to<U>(r);
|
||||
}
|
Loading…
Add table
Reference in a new issue