From e0a8968b8005c3fdc684303b9ebce4bdaab4d737 Mon Sep 17 00:00:00 2001 From: Anju Del Moral Gonzalez Date: Thu, 18 Feb 2021 11:27:16 -0800 Subject: [PATCH 1/6] updated bitset chanconv and typeindex --- stl/inc/bitset | 2 ++ stl/inc/charconv | 3 ++ stl/inc/typeindex | 8 ++++++ stl/inc/xcharconv.h | 3 ++ tests/std/tests/P1614R2_spaceship/test.cpp | 32 ++++++++++++++++++++++ 5 files changed, 48 insertions(+) diff --git a/stl/inc/bitset b/stl/inc/bitset index 8d21a2676ce..ff75bdd526b 100644 --- a/stl/inc/bitset +++ b/stl/inc/bitset @@ -370,9 +370,11 @@ public: return _CSTD memcmp(&_Array[0], &_Right._Array[0], sizeof(_Array)) == 0; } +#if !_HAS_CXX20 _NODISCARD bool operator!=(const bitset& _Right) const noexcept { return !(*this == _Right); } +#endif // !_HAS_CXX20 _NODISCARD bool test(size_t _Pos) const { if (_Bits <= _Pos) { diff --git a/stl/inc/charconv b/stl/inc/charconv index 9ab5d01ec81..cd69e173814 100644 --- a/stl/inc/charconv +++ b/stl/inc/charconv @@ -209,6 +209,9 @@ to_chars_result to_chars(char* _First, char* _Last, bool _Value, int _Base = 10) struct from_chars_result { const char* ptr; errc ec; +#if _HAS_CXX20 + friend bool operator==(const from_chars_result&, const from_chars_result&) = default; +#endif // _HAS_CXX20 }; // FUNCTION from_chars (STRING TO INTEGER) diff --git a/stl/inc/typeindex b/stl/inc/typeindex index 0aa47537679..c89cce83f02 100644 --- a/stl/inc/typeindex +++ b/stl/inc/typeindex @@ -38,9 +38,17 @@ public: return *_Tptr == *_Right._Tptr; } +#if !_HAS_CXX20 _NODISCARD bool operator!=(const type_index& _Right) const noexcept { return !(*this == _Right); } +#else // ^^^ !_HAS_CXX20 / _HAS_CXX20 vvv + _NODISCARD strong_ordering operator<=>(const type_index& _Right) const noexcept { + return *_Tptr == *_Right._Tptr ? strong_ordering::equal + : _Tptr->before(*_Right._Tptr) ? strong_ordering::less + : strong_ordering::greater; + } +#endif // !_HAS_CXX20 _NODISCARD bool operator<(const type_index& _Right) const noexcept { return _Tptr->before(*_Right._Tptr); diff --git a/stl/inc/xcharconv.h b/stl/inc/xcharconv.h index ecd69b6d02e..33958f3929a 100644 --- a/stl/inc/xcharconv.h +++ b/stl/inc/xcharconv.h @@ -39,6 +39,9 @@ _BITMASK_OPS(chars_format) struct to_chars_result { char* ptr; errc ec; +#if _HAS_CXX20 + friend bool operator==(const to_chars_result&, const to_chars_result&) = default; +#endif // _HAS_CXX20 }; _STD_END diff --git a/tests/std/tests/P1614R2_spaceship/test.cpp b/tests/std/tests/P1614R2_spaceship/test.cpp index e0788e989c0..be2bd68361d 100644 --- a/tests/std/tests/P1614R2_spaceship/test.cpp +++ b/tests/std/tests/P1614R2_spaceship/test.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -460,6 +462,36 @@ void ordering_test_cases() { static_assert(std::is_same_v::comparison_category, std::strong_ordering>); static_assert(std::is_same_v::comparison_category, std::strong_ordering>); } + { // charconv + char c[7] = "123456"; + int d; + std::from_chars_result a1 = std::from_chars(c, c + 6, d); + std::from_chars_result a2 = std::from_chars(c, c + 6, d); + std::from_chars_result a3 = std::from_chars(c + 1, c + 5, d); + std::from_chars_result a4 = std::from_chars(c - 10, c + 10, d); + + assert(a1 == a2); + assert(a1 != a3); + assert(a1 != a4); + + std::to_chars_result b1 = std::to_chars(c, c + 6, 123456); + std::to_chars_result b2 = std::to_chars(c, c + 6, 123456); + std::to_chars_result b3 = std::to_chars(c + 1, c + 5, 2345); + std::to_chars_result b4 = std::to_chars(c, c + 6, NAN); + + assert(b1 == b2); + assert(b1 != b3); + assert(b1 != b4); + } + { // typeindex + std::type_index a1 = typeid(int); + std::type_index a2 = typeid(char); + std::type_index a3 = typeid(bool); + std::type_index a4 = typeid(int); + assert((a1 <=> a4) == std::strong_ordering::equal); + assert((a1 <=> a2) == std::strong_ordering::greater); + assert((a1 <=> a3) == std::strong_ordering::less); + } { // Strings library const std::string a1 = "abcdef"; const std::string a2 = "abcdef"; From 2f0a7e364d2836522340b961a3c3bea968a66ccb Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 19 Feb 2021 16:01:35 -0800 Subject: [PATCH 2/6] Add _NODISCARD. --- stl/inc/charconv | 2 +- stl/inc/xcharconv.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/charconv b/stl/inc/charconv index cd69e173814..bdb31a1b857 100644 --- a/stl/inc/charconv +++ b/stl/inc/charconv @@ -210,7 +210,7 @@ struct from_chars_result { const char* ptr; errc ec; #if _HAS_CXX20 - friend bool operator==(const from_chars_result&, const from_chars_result&) = default; + _NODISCARD friend bool operator==(const from_chars_result&, const from_chars_result&) = default; #endif // _HAS_CXX20 }; diff --git a/stl/inc/xcharconv.h b/stl/inc/xcharconv.h index 33958f3929a..fff630353ae 100644 --- a/stl/inc/xcharconv.h +++ b/stl/inc/xcharconv.h @@ -40,7 +40,7 @@ struct to_chars_result { char* ptr; errc ec; #if _HAS_CXX20 - friend bool operator==(const to_chars_result&, const to_chars_result&) = default; + _NODISCARD friend bool operator==(const to_chars_result&, const to_chars_result&) = default; #endif // _HAS_CXX20 }; From 5ee9508da3215f45a3a734471e0b8b4e156fed99 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 19 Feb 2021 16:04:52 -0800 Subject: [PATCH 3/6] Avoid negated condition. --- stl/inc/typeindex | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/stl/inc/typeindex b/stl/inc/typeindex index c89cce83f02..68d02e809f7 100644 --- a/stl/inc/typeindex +++ b/stl/inc/typeindex @@ -38,17 +38,17 @@ public: return *_Tptr == *_Right._Tptr; } -#if !_HAS_CXX20 - _NODISCARD bool operator!=(const type_index& _Right) const noexcept { - return !(*this == _Right); - } -#else // ^^^ !_HAS_CXX20 / _HAS_CXX20 vvv +#if _HAS_CXX20 _NODISCARD strong_ordering operator<=>(const type_index& _Right) const noexcept { return *_Tptr == *_Right._Tptr ? strong_ordering::equal : _Tptr->before(*_Right._Tptr) ? strong_ordering::less : strong_ordering::greater; } -#endif // !_HAS_CXX20 +#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv + _NODISCARD bool operator!=(const type_index& _Right) const noexcept { + return !(*this == _Right); + } +#endif // ^^^ !_HAS_CXX20 ^^^ _NODISCARD bool operator<(const type_index& _Right) const noexcept { return _Tptr->before(*_Right._Tptr); From 33c8567f39ff521a28c202ea3ef213df90bd8c05 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 19 Feb 2021 16:12:23 -0800 Subject: [PATCH 4/6] Include for typeid. --- tests/std/tests/P1614R2_spaceship/test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/std/tests/P1614R2_spaceship/test.cpp b/tests/std/tests/P1614R2_spaceship/test.cpp index e222242d725..104b1619934 100644 --- a/tests/std/tests/P1614R2_spaceship/test.cpp +++ b/tests/std/tests/P1614R2_spaceship/test.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include From 215f0782e91d0b3172826afe2481a08417eae58a Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 19 Feb 2021 16:15:36 -0800 Subject: [PATCH 5/6] Comment type_index ordering assumptions. --- tests/std/tests/P1614R2_spaceship/test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/std/tests/P1614R2_spaceship/test.cpp b/tests/std/tests/P1614R2_spaceship/test.cpp index 104b1619934..87954dab6c7 100644 --- a/tests/std/tests/P1614R2_spaceship/test.cpp +++ b/tests/std/tests/P1614R2_spaceship/test.cpp @@ -604,8 +604,8 @@ void ordering_test_cases() { std::type_index a3 = typeid(bool); std::type_index a4 = typeid(int); assert((a1 <=> a4) == std::strong_ordering::equal); - assert((a1 <=> a2) == std::strong_ordering::greater); - assert((a1 <=> a3) == std::strong_ordering::less); + assert((a1 <=> a2) == std::strong_ordering::greater); // Implementation-specific assumption + assert((a1 <=> a3) == std::strong_ordering::less); // Implementation-specific assumption } { // Strings library const std::string a1 = "abcdef"; From 65d7a1617dc13f4714e833d857b099d6c02ee913 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 19 Feb 2021 16:34:37 -0800 Subject: [PATCH 6/6] Fix/enhance charconv tests. --- tests/std/tests/P1614R2_spaceship/test.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/std/tests/P1614R2_spaceship/test.cpp b/tests/std/tests/P1614R2_spaceship/test.cpp index 87954dab6c7..dd19714b162 100644 --- a/tests/std/tests/P1614R2_spaceship/test.cpp +++ b/tests/std/tests/P1614R2_spaceship/test.cpp @@ -579,20 +579,20 @@ void ordering_test_cases() { } { // charconv char c[7] = "123456"; - int d; - std::from_chars_result a1 = std::from_chars(c, c + 6, d); - std::from_chars_result a2 = std::from_chars(c, c + 6, d); - std::from_chars_result a3 = std::from_chars(c + 1, c + 5, d); - std::from_chars_result a4 = std::from_chars(c - 10, c + 10, d); + + std::from_chars_result a1{c + 6, std::errc{}}; + std::from_chars_result a2{c + 6, std::errc{}}; + std::from_chars_result a3{c + 6, std::errc::result_out_of_range}; + std::from_chars_result a4{c + 4, std::errc{}}; assert(a1 == a2); assert(a1 != a3); assert(a1 != a4); - std::to_chars_result b1 = std::to_chars(c, c + 6, 123456); - std::to_chars_result b2 = std::to_chars(c, c + 6, 123456); - std::to_chars_result b3 = std::to_chars(c + 1, c + 5, 2345); - std::to_chars_result b4 = std::to_chars(c, c + 6, NAN); + std::to_chars_result b1{c + 6, std::errc{}}; + std::to_chars_result b2{c + 6, std::errc{}}; + std::to_chars_result b3{c + 6, std::errc::value_too_large}; + std::to_chars_result b4{c + 4, std::errc{}}; assert(b1 == b2); assert(b1 != b3);