diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-02-27 15:48:49 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2025-02-28 21:35:27 +0000 |
commit | a9cfcd0d9e3780c71442057f636f62a7142056cb (patch) | |
tree | b13387bfe5e24eb20c0484766beffb37825e52dd | |
parent | f7bc17ebc9ef89700672ed7125da719f3558f3b7 (diff) | |
download | gcc-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/ranges | 3 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/conv/112803.cc | 20 |
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 } |