diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2013-11-06 14:24:38 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2013-11-06 14:24:38 +0000 |
commit | e42732232752f9c4b099cd15f23d0c319e9e3c38 (patch) | |
tree | 08ff4227c0937b7d83a34fb8e8c1f74c132f61a2 /libcxx | |
parent | [ASan] Use OS-specific matches in the malloc_context_size.cc lit test. (diff) | |
download | llvm-project-e42732232752f9c4b099cd15f23d0c319e9e3c38.tar.gz llvm-project-e42732232752f9c4b099cd15f23d0c319e9e3c38.tar.bz2 llvm-project-e42732232752f9c4b099cd15f23d0c319e9e3c38.zip |
Fix an off-by-one error in basic_string::__grow_by, where it would incorrectly throw length_error (instead of bad_alloc) when attempting to resize the string to 'max_size()'. Add tests for resizing to max_size +/-1
llvm-svn: 194151
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/include/string | 2 | ||||
-rw-r--r-- | libcxx/test/strings/basic.string/string.capacity/max_size.pass.cpp | 42 |
2 files changed, 37 insertions, 7 deletions
diff --git a/libcxx/include/string b/libcxx/include/string index 234eb6ba860d..e8bd69fcabd7 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -2181,7 +2181,7 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_t size_type __n_copy, size_type __n_del, size_type __n_add) { size_type __ms = max_size(); - if (__delta_cap > __ms - __old_cap - 1) + if (__delta_cap > __ms - __old_cap) this->__throw_length_error(); pointer __old_p = __get_pointer(); size_type __cap = __old_cap < __ms / 2 - __alignment ? diff --git a/libcxx/test/strings/basic.string/string.capacity/max_size.pass.cpp b/libcxx/test/strings/basic.string/string.capacity/max_size.pass.cpp index f9b228412c74..0fe7f123c897 100644 --- a/libcxx/test/strings/basic.string/string.capacity/max_size.pass.cpp +++ b/libcxx/test/strings/basic.string/string.capacity/max_size.pass.cpp @@ -18,15 +18,45 @@ template <class S> void -test(const S& s) +test1(const S& s) { - assert(s.max_size() >= s.size()); - { - S s2; - try { s2.resize(s2.max_size() - 1, 'x'); } + S s2(s); + const size_t sz = s2.max_size() - 1; + try { s2.resize(sz, 'x'); } catch ( const std::bad_alloc & ) { return ; } + assert ( s2.size() == sz ); +} + +template <class S> +void +test2(const S& s) +{ + S s2(s); + const size_t sz = s2.max_size(); + try { s2.resize(sz, 'x'); } + catch ( const std::bad_alloc & ) { return ; } + assert ( s.size() == sz ); +} + +template <class S> +void +test3(const S& s) +{ + S s2(s); + const size_t sz = s2.max_size() + 1; + try { s2.resize(sz, 'x'); } + catch ( const std::length_error & ) { return ; } assert ( false ); - } +} + +template <class S> +void +test(const S& s) +{ + assert(s.max_size() >= s.size()); + test1(s); + test2(s); + test3(s); } int main() |