From 1cf810b81bb7fab6dfbb9075a134c67621db6852 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Tue, 11 Nov 2014 22:07:10 +0000 Subject: [PATCH] Replaced checking in string_view::remove_suffix/remove_prefix by _LIBCPP_ASSERT, since this is technically undefined behavior. Fixes PR#21496 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@221717 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/experimental/string_view | 6 ++---- .../string.view.modifiers/remove_prefix.pass.cpp | 7 ++----- .../string.view.modifiers/remove_suffix.pass.cpp | 7 ++----- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/include/experimental/string_view b/include/experimental/string_view index 18706150f..d423f3900 100644 --- a/include/experimental/string_view +++ b/include/experimental/string_view @@ -313,8 +313,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY void remove_prefix(size_type __n) _NOEXCEPT { - if (__n > __size) - __n = __size; + _LIBCPP_ASSERT(n <= size(), "remove_prefix() can't remove more than size()"); __data += __n; __size -= __n; } @@ -322,8 +321,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY void remove_suffix(size_type __n) _NOEXCEPT { - if (__n > __size) - __n = __size; + _LIBCPP_ASSERT(n <= size(), "remove_suffix() can't remove more than size()"); __size -= __n; } diff --git a/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp b/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp index e99514a0d..0a2dd6d93 100644 --- a/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp +++ b/test/experimental/string.view/string.view.modifiers/remove_prefix.pass.cpp @@ -28,13 +28,11 @@ void test ( const CharT *s, size_t len ) { sv1.remove_prefix ( 1 ); assert ( sv1.size() == (len - 1)); assert ( sv1.data() == (s + 1)); + sv1.remove_prefix ( len - 1 ); } - sv1.remove_prefix ( len - 1 ); assert ( sv1.size() == 0 ); - - SV sv2 ( s ); - sv2.remove_prefix ( len << 1 ); + sv1.remove_prefix ( 0 ); assert ( sv1.size() == 0 ); } } @@ -72,7 +70,6 @@ int main () { static_assert ( test_ce ( 5, 0 ) == 5, "" ); static_assert ( test_ce ( 5, 1 ) == 4, "" ); static_assert ( test_ce ( 5, 5 ) == 0, "" ); - static_assert ( test_ce ( 5, 9 ) == 0, "" ); static_assert ( test_ce ( 9, 3 ) == 6, "" ); } #endif diff --git a/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp b/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp index 5baaab06a..9dd59882c 100644 --- a/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp +++ b/test/experimental/string.view/string.view.modifiers/remove_suffix.pass.cpp @@ -27,13 +27,11 @@ void test ( const CharT *s, size_t len ) { sv1.remove_suffix ( 1 ); assert ( sv1.size() == (len - 1)); assert ( sv1.data() == s); + sv1.remove_suffix ( len - 1 ); } - sv1.remove_suffix ( len - 1 ); assert ( sv1.size() == 0 ); - - SV sv2 ( s ); - sv2.remove_suffix ( len << 1 ); + sv1.remove_suffix ( 0 ); assert ( sv1.size() == 0 ); } @@ -72,7 +70,6 @@ int main () { static_assert ( test_ce ( 5, 0 ) == 5, "" ); static_assert ( test_ce ( 5, 1 ) == 4, "" ); static_assert ( test_ce ( 5, 5 ) == 0, "" ); - static_assert ( test_ce ( 5, 9 ) == 0, "" ); static_assert ( test_ce ( 9, 3 ) == 6, "" ); } #endif