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