aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2025-03-25 00:27:52 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2025-03-25 17:44:25 +0000
commit479a0a8644e5efa0470f032be21ca7749968af42 (patch)
treed2005d20d4abdea5a458d8d9d145274e2f31b3cc
parente200f53a5556516ec831e6b7a34aaa0f10a4ab0a (diff)
downloadgcc-479a0a8644e5efa0470f032be21ca7749968af42.zip
gcc-479a0a8644e5efa0470f032be21ca7749968af42.tar.gz
gcc-479a0a8644e5efa0470f032be21ca7749968af42.tar.bz2
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>
-rw-r--r--libstdc++-v3/include/std/ranges4
-rw-r--r--libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc18
2 files changed, 20 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 34c6f11..7a339c5 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -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;
diff --git a/libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc b/libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc
new file mode 100644
index 0000000..780ed1f
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc
@@ -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);
+}