aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2025-02-27 15:48:49 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2025-02-28 21:35:27 +0000
commita9cfcd0d9e3780c71442057f636f62a7142056cb (patch)
treeb13387bfe5e24eb20c0484766beffb37825e52dd
parentf7bc17ebc9ef89700672ed7125da719f3558f3b7 (diff)
downloadgcc-a9cfcd0d9e3780c71442057f636f62a7142056cb.zip
gcc-a9cfcd0d9e3780c71442057f636f62a7142056cb.tar.gz
gcc-a9cfcd0d9e3780c71442057f636f62a7142056cb.tar.bz2
libstdc++: Add static_assertions to ranges::to adaptor factory [PR112803]
The standard requires that we reject attempts to create a ranges::to adaptor for cv-qualified types and non-class types. Currently we only diagnose it once the adaptor is used in a pipeline. This adds static assertions to diagnose it immediately. libstdc++-v3/ChangeLog: PR libstdc++/112803 * include/std/ranges (ranges::to): Add static assertions to enforce Mandates conditions. * testsuite/std/ranges/conv/112803.cc: New test.
-rw-r--r--libstdc++-v3/include/std/ranges3
-rw-r--r--libstdc++-v3/testsuite/std/ranges/conv/112803.cc20
2 files changed, 23 insertions, 0 deletions
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 6c65722..c0b1134 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -9569,6 +9569,9 @@ namespace __detail
constexpr auto
to [[nodiscard]] (_Args&&... __args)
{
+ static_assert(!is_const_v<_Cont> && !is_volatile_v<_Cont>);
+ static_assert(is_class_v<_Cont>);
+
using __detail::_To;
using views::__adaptor::_Partial;
return _Partial<_To<_Cont>, decay_t<_Args>...>{0, std::forward<_Args>(__args)...};
diff --git a/libstdc++-v3/testsuite/std/ranges/conv/112803.cc b/libstdc++-v3/testsuite/std/ranges/conv/112803.cc
new file mode 100644
index 0000000..0a73b02
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/ranges/conv/112803.cc
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++23 } }
+
+// Bug 112803 - <ranges>: to(Args&&... args) is missing Mandates
+
+#include <ranges>
+
+void
+test()
+{
+ struct C { };
+
+ (void) std::ranges::to<int>(); // { dg-error "here" }
+ (void) std::ranges::to<C*>(); // { dg-error "here" }
+ (void) std::ranges::to<C&>(); // { dg-error "here" }
+ (void) std::ranges::to<const C>(); // { dg-error "here" }
+ (void) std::ranges::to<volatile C>(); // { dg-error "here" }
+ (void) std::ranges::to<const volatile C>(); // { dg-error "here" }
+}
+
+// { dg-error "static assertion failed" "" { target *-*-* } 0 }