From ba3472358a765a9432e6280cc48882e4134602de Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Fri, 28 Jul 2023 01:08:17 +0800 Subject: [PATCH 1/7] ``: Missed exception strengthening --- stl/inc/valarray | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stl/inc/valarray b/stl/inc/valarray index a871212f858..8fd253c5b84 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -1669,7 +1669,7 @@ public: } } - _NODISCARD _Ty& _Data(size_t _Idx) const { + _NODISCARD _Ty& _Data(size_t _Idx) const noexcept { return _Myptr[_Idx]; } @@ -1809,7 +1809,7 @@ public: return _Off; } - _NODISCARD size_t _Totlen() const { + _NODISCARD size_t _Totlen() const noexcept { size_t _Count = 0; const size_t _Size = _Mybool.size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1933,7 +1933,7 @@ public: } } - _NODISCARD _Ty& _Data(size_t _Idx) const { + _NODISCARD _Ty& _Data(size_t _Idx) const noexcept { return _Myptr[_Idx]; } From 008c2df06950c6b6e55264b89466fe24fdbca4b2 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Fri, 28 Jul 2023 07:11:31 +0800 Subject: [PATCH 2/7] ``: Construction/assignment cleanup for `valarray` --- stl/inc/valarray | 42 ++++++++++-------------------------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/stl/inc/valarray b/stl/inc/valarray index 8fd253c5b84..f9f5446215c 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -73,71 +73,53 @@ public: using value_type = _Ty; - valarray() noexcept /* strengthened */ { // construct empty valarray - _Tidy_init(); - } + valarray() = default; // construct empty valarray explicit valarray(size_t _Count) { // construct with _Count * _Ty() - _Tidy_init(); _Grow(_Count); } valarray(const _Ty& _Val, size_t _Count) { // construct with _Count * _Val - _Tidy_init(); _Grow(_Count, &_Val); } valarray(const _Ty* _Ptr, size_t _Count) { // construct with [_Ptr, _Ptr + _Count) - _Tidy_init(); _Grow(_Count, _Ptr, 1); } valarray(const valarray& _Right) { - _Tidy_init(); _Grow(_Right.size(), _Right._Myptr, 1); } valarray(const slice_array<_Ty>& _Slicearr) { - _Tidy_init(); *this = _Slicearr; } valarray(const gslice_array<_Ty>& _Gslicearr) { - _Tidy_init(); *this = _Gslicearr; } valarray(const mask_array<_Ty>& _Maskarr) { - _Tidy_init(); *this = _Maskarr; } valarray(const indirect_array<_Ty>& _Indarr) { - _Tidy_init(); *this = _Indarr; } - valarray(valarray&& _Right) noexcept { - _Tidy_init(); - _Assign_rv(_STD move(_Right)); - } + valarray(valarray&& _Right) noexcept + : _Myptr(_STD exchange(_Right._Myptr, nullptr)), _Mysize(_STD exchange(_Right._Mysize, 0)) {} valarray& operator=(valarray&& _Right) noexcept { - _Assign_rv(_STD move(_Right)); - return *this; - } - - void _Assign_rv(valarray&& _Right) noexcept { if (this != _STD addressof(_Right)) { // clear this and steal from _Right _Tidy_deallocate(); - _Myptr = _Right._Myptr; - _Mysize = _Right._Mysize; - _Right._Tidy_init(); + _Myptr = _STD exchange(_Right._Myptr, nullptr); + _Mysize = _STD exchange(_Right._Mysize, 0); } + return *this; } valarray(initializer_list<_Ty> _Ilist) { - _Tidy_init(); _Grow(_Ilist.size(), _Ilist.begin(), 1); } @@ -548,11 +530,6 @@ private: } } - void _Tidy_init() noexcept { - _Mysize = 0; - _Myptr = nullptr; - } - void _Tidy_deallocate() noexcept { if (_Myptr) { // destroy elements for (size_t _Idx = 0; _Idx < _Mysize; ++_Idx) { @@ -570,7 +547,8 @@ private: } } - _Tidy_init(); + _Mysize = 0; + _Myptr = nullptr; } void _Assign(size_t _Newsize, const _Ty* _Ptr) { @@ -585,8 +563,8 @@ private: } } - _Ty* _Myptr; // current storage reserved for array - size_t _Mysize; // current length of sequence + _Ty* _Myptr = nullptr; // current storage reserved for array + size_t _Mysize = 0; // current length of sequence }; #if _HAS_CXX17 From 340b0c278a2882307113e92448c58da07535d44e Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 30 Jul 2023 01:11:49 +0800 Subject: [PATCH 3/7] ``: Length checking for binary `valarray` operations --- stl/inc/valarray | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/stl/inc/valarray b/stl/inc/valarray index f9f5446215c..374d369e253 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -298,6 +298,9 @@ public: } valarray& operator/=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] /= _Right[_Idx]; @@ -306,6 +309,9 @@ public: } valarray& operator%=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] %= _Right[_Idx]; @@ -314,6 +320,9 @@ public: } valarray& operator+=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] += _Right[_Idx]; @@ -322,6 +331,9 @@ public: } valarray& operator-=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] -= _Right[_Idx]; @@ -330,6 +342,9 @@ public: } valarray& operator^=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] ^= _Right[_Idx]; @@ -338,6 +353,9 @@ public: } valarray& operator|=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] |= _Right[_Idx]; @@ -346,6 +364,9 @@ public: } valarray& operator&=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] &= _Right[_Idx]; @@ -354,6 +375,9 @@ public: } valarray& operator<<=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] <<= _Right[_Idx]; @@ -362,6 +386,9 @@ public: } valarray& operator>>=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] >>= _Right[_Idx]; @@ -839,6 +866,9 @@ _NODISCARD _Boolarray operator||(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD valarray<_Ty> operator*(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -849,6 +879,9 @@ _NODISCARD valarray<_Ty> operator*(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator/(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -859,6 +892,9 @@ _NODISCARD valarray<_Ty> operator/(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator%(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -869,6 +905,9 @@ _NODISCARD valarray<_Ty> operator%(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator+(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -879,6 +918,9 @@ _NODISCARD valarray<_Ty> operator+(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator-(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -889,6 +931,9 @@ _NODISCARD valarray<_Ty> operator-(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator^(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -899,6 +944,9 @@ _NODISCARD valarray<_Ty> operator^(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator&(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -909,6 +957,9 @@ _NODISCARD valarray<_Ty> operator&(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator|(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -919,6 +970,9 @@ _NODISCARD valarray<_Ty> operator|(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator<<(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -929,6 +983,9 @@ _NODISCARD valarray<_Ty> operator<<(const valarray<_Ty>& _Left, const valarray<_ _EXPORT_STD template _NODISCARD valarray<_Ty> operator>>(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -939,6 +996,9 @@ _NODISCARD valarray<_Ty> operator>>(const valarray<_Ty>& _Left, const valarray<_ _EXPORT_STD template _NODISCARD _Boolarray operator&&(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -949,6 +1009,9 @@ _NODISCARD _Boolarray operator&&(const valarray<_Ty>& _Left, const valarray<_Ty> _EXPORT_STD template _NODISCARD _Boolarray operator||(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -959,6 +1022,9 @@ _NODISCARD _Boolarray operator||(const valarray<_Ty>& _Left, const valarray<_Ty> _EXPORT_STD template _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const typename valarray<_Ty>::value_type& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -969,6 +1035,9 @@ _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const typename vala _EXPORT_STD template _NODISCARD _Boolarray operator==(const typename valarray<_Ty>::value_type& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Right.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -979,6 +1048,9 @@ _NODISCARD _Boolarray operator==(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1009,6 +1081,9 @@ _NODISCARD _Boolarray operator!=(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator!=(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1039,6 +1114,9 @@ _NODISCARD _Boolarray operator<(const typename valarray<_Ty>::value_type& _Left, _EXPORT_STD template _NODISCARD _Boolarray operator<(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1069,6 +1147,9 @@ _NODISCARD _Boolarray operator>(const typename valarray<_Ty>::value_type& _Left, _EXPORT_STD template _NODISCARD _Boolarray operator>(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1099,6 +1180,9 @@ _NODISCARD _Boolarray operator<=(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator<=(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1129,6 +1213,9 @@ _NODISCARD _Boolarray operator>=(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator>=(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { From c97e71bdb85b531d9bd4b092120c299ece4f20b4 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 30 Jul 2023 01:45:36 +0800 Subject: [PATCH 4/7] Fix misuse of `_Mysize` --- stl/inc/valarray | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/stl/inc/valarray b/stl/inc/valarray index 374d369e253..1bc09a1aad5 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -867,7 +867,7 @@ _NODISCARD _Boolarray operator||(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD valarray<_Ty> operator*(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -880,7 +880,7 @@ _NODISCARD valarray<_Ty> operator*(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator/(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -893,7 +893,7 @@ _NODISCARD valarray<_Ty> operator/(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator%(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -906,7 +906,7 @@ _NODISCARD valarray<_Ty> operator%(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator+(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -919,7 +919,7 @@ _NODISCARD valarray<_Ty> operator+(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator-(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -932,7 +932,7 @@ _NODISCARD valarray<_Ty> operator-(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator^(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -945,7 +945,7 @@ _NODISCARD valarray<_Ty> operator^(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator&(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -958,7 +958,7 @@ _NODISCARD valarray<_Ty> operator&(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator|(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -971,7 +971,7 @@ _NODISCARD valarray<_Ty> operator|(const valarray<_Ty>& _Left, const valarray<_T _EXPORT_STD template _NODISCARD valarray<_Ty> operator<<(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -984,7 +984,7 @@ _NODISCARD valarray<_Ty> operator<<(const valarray<_Ty>& _Left, const valarray<_ _EXPORT_STD template _NODISCARD valarray<_Ty> operator>>(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray<_Ty> _Ans(_Size); @@ -997,7 +997,7 @@ _NODISCARD valarray<_Ty> operator>>(const valarray<_Ty>& _Left, const valarray<_ _EXPORT_STD template _NODISCARD _Boolarray operator&&(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1010,7 +1010,7 @@ _NODISCARD _Boolarray operator&&(const valarray<_Ty>& _Left, const valarray<_Ty> _EXPORT_STD template _NODISCARD _Boolarray operator||(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1023,7 +1023,7 @@ _NODISCARD _Boolarray operator||(const valarray<_Ty>& _Left, const valarray<_Ty> _EXPORT_STD template _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const typename valarray<_Ty>::value_type& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1036,7 +1036,7 @@ _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const typename vala _EXPORT_STD template _NODISCARD _Boolarray operator==(const typename valarray<_Ty>::value_type& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Right.size(); valarray _Ans(_Size); @@ -1049,7 +1049,7 @@ _NODISCARD _Boolarray operator==(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1082,7 +1082,7 @@ _NODISCARD _Boolarray operator!=(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator!=(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1115,7 +1115,7 @@ _NODISCARD _Boolarray operator<(const typename valarray<_Ty>::value_type& _Left, _EXPORT_STD template _NODISCARD _Boolarray operator<(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1148,7 +1148,7 @@ _NODISCARD _Boolarray operator>(const typename valarray<_Ty>::value_type& _Left, _EXPORT_STD template _NODISCARD _Boolarray operator>(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1181,7 +1181,7 @@ _NODISCARD _Boolarray operator<=(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator<=(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); @@ -1214,7 +1214,7 @@ _NODISCARD _Boolarray operator>=(const typename valarray<_Ty>::value_type& _Left _EXPORT_STD template _NODISCARD _Boolarray operator>=(const valarray<_Ty>& _Left, const valarray<_Ty>& _Right) { #if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left._Mysize == _Right._Mysize, "valarrays of different lengths"); + _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); #endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); From f07bad99d25aada08020850f2d76d2fc5f38302e Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 30 Jul 2023 02:24:29 +0800 Subject: [PATCH 5/7] Drops some mis-checks --- stl/inc/valarray | 6 ------ 1 file changed, 6 deletions(-) diff --git a/stl/inc/valarray b/stl/inc/valarray index 1bc09a1aad5..ae6f54c6c8c 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -1022,9 +1022,6 @@ _NODISCARD _Boolarray operator||(const valarray<_Ty>& _Left, const valarray<_Ty> _EXPORT_STD template _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const typename valarray<_Ty>::value_type& _Right) { -#if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); -#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Left.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { @@ -1035,9 +1032,6 @@ _NODISCARD _Boolarray operator==(const valarray<_Ty>& _Left, const typename vala _EXPORT_STD template _NODISCARD _Boolarray operator==(const typename valarray<_Ty>::value_type& _Left, const valarray<_Ty>& _Right) { -#if _CONTAINER_DEBUG_LEVEL > 0 - _STL_VERIFY(_Left.size() == _Right.size(), "valarrays of different lengths"); -#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = _Right.size(); valarray _Ans(_Size); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { From 05286a4fbf9f66fb73c790eba25472cfe9f16505 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 30 Jul 2023 02:52:59 +0800 Subject: [PATCH 6/7] Use `size_t{}` instead of `0` to fix signedness mismatch --- stl/inc/valarray | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/valarray b/stl/inc/valarray index ae6f54c6c8c..4359ea06311 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -108,13 +108,13 @@ public: } valarray(valarray&& _Right) noexcept - : _Myptr(_STD exchange(_Right._Myptr, nullptr)), _Mysize(_STD exchange(_Right._Mysize, 0)) {} + : _Myptr(_STD exchange(_Right._Myptr, nullptr)), _Mysize(_STD exchange(_Right._Mysize, size_t{})) {} valarray& operator=(valarray&& _Right) noexcept { if (this != _STD addressof(_Right)) { // clear this and steal from _Right _Tidy_deallocate(); _Myptr = _STD exchange(_Right._Myptr, nullptr); - _Mysize = _STD exchange(_Right._Mysize, 0); + _Mysize = _STD exchange(_Right._Mysize, size_t{}); } return *this; } From e486f21744bcd9fb8e39a8136f77ecad55098c17 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 31 Jul 2023 12:12:49 -0700 Subject: [PATCH 7/7] Missed `operator*=(const valarray& _Right)`. --- stl/inc/valarray | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stl/inc/valarray b/stl/inc/valarray index 4359ea06311..f7c16ad59e8 100644 --- a/stl/inc/valarray +++ b/stl/inc/valarray @@ -290,6 +290,9 @@ public: } valarray& operator*=(const valarray& _Right) { +#if _CONTAINER_DEBUG_LEVEL > 0 + _STL_VERIFY(_Mysize == _Right._Mysize, "valarrays of different lengths"); +#endif // _CONTAINER_DEBUG_LEVEL > 0 const size_t _Size = size(); for (size_t _Idx = 0; _Idx < _Size; ++_Idx) { _Myptr[_Idx] *= _Right[_Idx];