libstdc++: Fix std::forward_list::assign assignable check [PR122661]

The std::is_assignable check should test for assignment to an lvalue,
not an rvalue.

libstdc++-v3/ChangeLog:

	PR libstdc++/122661
	* include/bits/forward_list.h (forward_list::assign(I, I)): Fix
	value category in is_assignable check.
	* testsuite/23_containers/forward_list/modifiers/122661.cc:
	New test.
This commit is contained in:
Jonathan Wakely
2025-11-13 09:45:12 +00:00
committed by Jonathan Wakely
parent bc7a89048e
commit 9332dfd452
2 changed files with 21 additions and 1 deletions

View File

@@ -1046,7 +1046,7 @@ namespace __fwdlist
void
assign(_InputIterator __first, _InputIterator __last)
{
if constexpr (is_assignable<_Tp, decltype(*__first)>::value)
if constexpr (is_assignable<_Tp&, decltype(*__first)>::value)
{
auto __prev = before_begin();
auto __curr = begin();

View File

@@ -0,0 +1,20 @@
// { dg-do compile { target c++11 } }
// Bug 122661 - Incorrect value category handling in forward_list::assign
#include <forward_list>
struct S
{
S();
S& operator=(S const&) & = delete;
S& operator=(S const&) &&;
};
void
test_pr122661()
{
std::forward_list<S> fl;
S* iter = nullptr;
fl.assign(iter, iter);
}