[committed] libstdc++: Fix resolution of LWG 4016 for std::ranges::to [PR112876]
Checks
Commit Message
Tested x86_64-linux. Pushed to trunk.
-- >8 --
What I implemented in r14-6199-g45630fbcf7875b does not match what I
proposed for LWG 4016, and it imposes additional, unwanted requirements
on the emplace and insert member functions of the container being
populated.
libstdc++-v3/ChangeLog:
PR libstdc++/112876
* include/std/ranges (ranges::to): Do not try to use an iterator
returned by the container's emplace or insert member functions.
* testsuite/std/ranges/conv/1.cc (Cont4::emplace, Cont4::insert):
Use the iterator parameter. Do not return an iterator.
---
libstdc++-v3/include/std/ranges | 10 +++-------
libstdc++-v3/testsuite/std/ranges/conv/1.cc | 12 ++++++------
2 files changed, 9 insertions(+), 13 deletions(-)
@@ -9300,14 +9300,10 @@ namespace __detail
__c.emplace_back(*__it);
else if constexpr (requires { __c.push_back(*__it); })
__c.push_back(*__it);
+ else if constexpr (requires { __c.emplace(__c.end(), *__it); })
+ __c.emplace(__c.end(), *__it);
else
- {
- auto __end = __c.end();
- if constexpr (requires { __c.emplace(__end, *__it); })
- __end = __c.emplace(__end, *__it);
- else
- __end = __c.insert(__end, *__it);
- }
+ __c.insert(__c.end(), *__it);
++__it;
}
return __c;
@@ -236,19 +236,19 @@ struct Cont4
template<typename T>
requires (Kind <= Emplace)
&& requires(C& c, T&& t) { c.emplace(c.end(), std::forward<T>(t)); }
- typename C::iterator
- emplace(typename C::iterator, T&& t)
+ void
+ emplace(typename C::iterator pos, T&& t)
{
kind = Emplace;
- return c.emplace(c.end(), std::forward<T>(t));
+ c.emplace(pos, std::forward<T>(t));
}
template<typename T>
- typename C::iterator
- insert(typename C::iterator, T&& t)
+ void
+ insert(typename C::iterator pos, T&& t)
{
kind = Insert;
- return c.insert(c.end(), std::forward<T>(t));
+ c.insert(pos, std::forward<T>(t));
}
// Required to satisfy reservable-container