From f2e36ef0937f704a96bc13f50074d2c17c7df96d Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Thu, 12 Feb 2015 23:34:52 +0000 Subject: [PATCH] Move the test for zero-length into the char_traits (from string_view). Add tests to char_traits specializations git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@228981 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/experimental/string_view | 2 +- include/string | 4 ++-- .../char.traits.specializations.char/compare.pass.cpp | 1 + .../char.traits.specializations.char16_t/compare.pass.cpp | 1 + .../char.traits.specializations.char32_t/compare.pass.cpp | 1 + .../char.traits.specializations.wchar.t/compare.pass.cpp | 1 + 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/experimental/string_view b/include/experimental/string_view index d9593df6..d423f390 100644 --- a/include/experimental/string_view +++ b/include/experimental/string_view @@ -375,7 +375,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS _LIBCPP_CONSTEXPR_AFTER_CXX11 int compare(basic_string_view __sv) const _NOEXCEPT { size_type __rlen = _VSTD::min( size(), __sv.size()); - int __retval = __rlen == 0 ? 0 : _Traits::compare(data(), __sv.data(), __rlen); + int __retval = _Traits::compare(data(), __sv.data(), __rlen); if ( __retval == 0 ) // first __rlen chars matched __retval = size() == __sv.size() ? 0 : ( size() < __sv.size() ? -1 : 1 ); return __retval; diff --git a/include/string b/include/string index fe42bbf1..9f4007af 100644 --- a/include/string +++ b/include/string @@ -636,7 +636,7 @@ struct _LIBCPP_TYPE_VIS_ONLY char_traits {return (unsigned char)__c1 < (unsigned char)__c2;} static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n) - {return memcmp(__s1, __s2, __n);} + {return __n == 0 ? 0 : memcmp(__s1, __s2, __n);} static inline size_t length(const char_type* __s) {return strlen(__s);} static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a) {return (const char_type*)memchr(__s, to_int_type(__a), __n);} @@ -681,7 +681,7 @@ struct _LIBCPP_TYPE_VIS_ONLY char_traits {return __c1 < __c2;} static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n) - {return wmemcmp(__s1, __s2, __n);} + {return __n == 0 ? 0 : wmemcmp(__s1, __s2, __n);} static inline size_t length(const char_type* __s) {return wcslen(__s);} static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a) diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char/compare.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char/compare.pass.cpp index a7190e73..ba58684b 100644 --- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char/compare.pass.cpp +++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char/compare.pass.cpp @@ -19,6 +19,7 @@ int main() { assert(std::char_traits::compare("", "", 0) == 0); + assert(std::char_traits::compare(NULL, NULL, 0) == 0); assert(std::char_traits::compare("1", "1", 1) == 0); assert(std::char_traits::compare("1", "2", 1) < 0); diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char16_t/compare.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char16_t/compare.pass.cpp index 9f8461e0..b5039072 100644 --- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char16_t/compare.pass.cpp +++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char16_t/compare.pass.cpp @@ -21,6 +21,7 @@ int main() #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS #if __cplusplus >= 201103L assert(std::char_traits::compare(u"", u"", 0) == 0); + assert(std::char_traits::compare(NULL, NULL, 0) == 0); assert(std::char_traits::compare(u"1", u"1", 1) == 0); assert(std::char_traits::compare(u"1", u"2", 1) < 0); diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char32_t/compare.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char32_t/compare.pass.cpp index ee3019cf..25f20998 100644 --- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char32_t/compare.pass.cpp +++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.char32_t/compare.pass.cpp @@ -21,6 +21,7 @@ int main() #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS #if __cplusplus >= 201103L assert(std::char_traits::compare(U"", U"", 0) == 0); + assert(std::char_traits::compare(NULL, NULL, 0) == 0); assert(std::char_traits::compare(U"1", U"1", 1) == 0); assert(std::char_traits::compare(U"1", U"2", 1) < 0); diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp index 046398b3..124201bb 100644 --- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp +++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp @@ -19,6 +19,7 @@ int main() { assert(std::char_traits::compare(L"", L"", 0) == 0); + assert(std::char_traits::compare(NULL, NULL, 0) == 0); assert(std::char_traits::compare(L"1", L"1", 1) == 0); assert(std::char_traits::compare(L"1", L"2", 1) < 0);