From 722e1507c8b6befff1b947dd2627157db0c06efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=8B=B1=E5=A5=87=20Zhang=20Yingqi?= Date: Sun, 29 Sep 2024 04:09:35 +0800 Subject: [PATCH] Do not deduce the return type of `unique,remove[_if]` of `[forward_]list` (#4975) --- stl/inc/forward_list | 8 ++++---- stl/inc/list | 8 ++++---- stl/inc/xmemory | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/stl/inc/forward_list b/stl/inc/forward_list index 62c888e47..d213386f2 100644 --- a/stl/inc/forward_list +++ b/stl/inc/forward_list @@ -1208,12 +1208,12 @@ public: _Nodeptr* _Tail; }; - auto remove(const _Ty& _Val) { // erase each element matching _Val + _LIST_REMOVE_RETURN remove(const _Ty& _Val) { // erase each element matching _Val return remove_if([&](const _Ty& _Other) -> bool { return _Other == _Val; }); } template - auto remove_if(_Pr1 _Pred) { // erase each element satisfying _Pr1 + _LIST_REMOVE_RETURN remove_if(_Pr1 _Pred) { // erase each element satisfying _Pr1 _Flist_node_remove_op _Op(*this); auto _Firstb = _Unchecked_before_begin(); size_type _Removed = 0; @@ -1235,12 +1235,12 @@ public: #endif } - auto unique() { // erase each element matching previous + _LIST_REMOVE_RETURN unique() { // erase each element matching previous return unique(equal_to<>{}); } template - auto unique(_Pr2 _Pred) { // erase each element satisfying _Pred with previous + _LIST_REMOVE_RETURN unique(_Pr2 _Pred) { // erase each element satisfying _Pred with previous _Flist_node_remove_op _Op(*this); auto _First = _Unchecked_begin(); size_type _Removed = 0; diff --git a/stl/inc/list b/stl/inc/list index 033a43c60..d89caf3f3 100644 --- a/stl/inc/list +++ b/stl/inc/list @@ -1662,12 +1662,12 @@ public: _Nodeptr* _Tail; }; - auto remove(const _Ty& _Val) { // erase each element matching _Val + _LIST_REMOVE_RETURN remove(const _Ty& _Val) { // erase each element matching _Val return remove_if([&](const _Ty& _Other) -> bool { return _Other == _Val; }); } template - auto remove_if(_Pr1 _Pred) { // erase each element satisfying _Pred + _LIST_REMOVE_RETURN remove_if(_Pr1 _Pred) { // erase each element satisfying _Pred auto& _My_data = _Mypair._Myval2; _List_node_remove_op _Op(*this); const auto _Last = _My_data._Myhead; @@ -1688,12 +1688,12 @@ public: #endif } - auto unique() { // erase each element matching previous + _LIST_REMOVE_RETURN unique() { // erase each element matching previous return unique(equal_to<>{}); } template - auto unique(_Pr2 _Pred) { // erase each element satisfying _Pred with previous + _LIST_REMOVE_RETURN unique(_Pr2 _Pred) { // erase each element satisfying _Pred with previous _List_node_remove_op _Op(*this); const _Nodeptr _Phead = _Mypair._Myval2._Myhead; _Nodeptr _Pprev = _Phead->_Next; diff --git a/stl/inc/xmemory b/stl/inc/xmemory index 3aa11f488..8f02402e3 100644 --- a/stl/inc/xmemory +++ b/stl/inc/xmemory @@ -2649,6 +2649,12 @@ _STD_END #define _CONTAINER_EMPLACE_RETURN void #endif // ^^^ !_HAS_CXX17 ^^^ +#if _HAS_CXX20 +#define _LIST_REMOVE_RETURN size_type +#else // ^^^ _HAS_CXX20 ^^^ / vvv !_HAS_CXX20 vvv +#define _LIST_REMOVE_RETURN void +#endif // ^^^ !_HAS_CXX20 ^^^ + #pragma pop_macro("new") _STL_RESTORE_CLANG_WARNINGS #pragma warning(pop)