inline typename forward_list<_Tp, _Alloc>::size_type
erase(forward_list<_Tp, _Alloc>& __cont, const _Up& __value)
{
- using __elem_type = typename forward_list<_Tp, _Alloc>::value_type;
- return std::erase_if(__cont, [&](__elem_type& __elem) {
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4135. helper lambda of std::erase for list should specify return type
+ return std::erase_if(__cont, [&](const auto& __elem) -> bool {
return __elem == __value;
});
}
inline typename list<_Tp, _Alloc>::size_type
erase(list<_Tp, _Alloc>& __cont, const _Up& __value)
{
- using __elem_type = typename list<_Tp, _Alloc>::value_type;
- return std::erase_if(__cont, [&](__elem_type& __elem) {
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4135. helper lambda of std::erase for list should specify return type
+ return std::erase_if(__cont, [&](const auto& __elem) -> bool {
return __elem == __value;
});
}
VERIFY( num == 0 );
}
+// LWG 4135.
+// The helper lambda of std::erase for list should specify return type as bool
+void
+test_lwg4135()
+{
+ struct Bool {
+ Bool() = default;
+ Bool(const Bool&) = delete;
+ operator bool() const { return false; }
+ };
+
+ static Bool b;
+
+ struct Int {
+ Bool& operator==(Int) const { return b; }
+ void operator==(Int) = delete;
+ };
+
+ std::forward_list<Int> l;
+ std::erase(l, Int{});
+}
+
int
main()
{
VERIFY( num == 0 );
}
+// LWG 4135.
+// The helper lambda of std::erase for list should specify return type as bool
+void
+test_lwg4135()
+{
+ struct Bool {
+ Bool() = default;
+ Bool(const Bool&) = delete;
+ operator bool() const { return false; }
+ };
+
+ static Bool b;
+
+ struct Int {
+ Bool& operator==(Int) const { return b; }
+ void operator==(Int) = delete;
+ };
+
+ std::list<Int> l;
+ std::erase(l, Int{});
+}
+
int
main()
{