libstdc++: Fix resolution of LWG 4016 for std::ranges::to [PR112876]

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.
This commit is contained in:
Jonathan Wakely 2023-12-08 13:47:04 +00:00
parent 36be2a0e91
commit a314edee24
2 changed files with 9 additions and 13 deletions

View file

@ -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;

View file

@ -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