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