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>
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>)
{
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;
--- /dev/null
+// { 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);
+}