diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-03-25 00:27:52 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2025-03-25 17:44:25 +0000 |
commit | 479a0a8644e5efa0470f032be21ca7749968af42 (patch) | |
tree | d2005d20d4abdea5a458d8d9d145274e2f31b3cc | |
parent | e200f53a5556516ec831e6b7a34aaa0f10a4ab0a (diff) | |
download | gcc-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/ranges | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/conv/lwg4229.cc | 18 |
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); +} |