diff --git a/include/string b/include/string index 234eb6ba..e8bd69fc 100644 --- a/include/string +++ b/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/test/strings/basic.string/string.capacity/max_size.pass.cpp b/test/strings/basic.string/string.capacity/max_size.pass.cpp index f9b22841..0fe7f123 100644 --- a/test/strings/basic.string/string.capacity/max_size.pass.cpp +++ b/test/strings/basic.string/string.capacity/max_size.pass.cpp @@ -16,17 +16,47 @@ #include "../min_allocator.h" +template +void +test1(const S& s) +{ + 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 +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 +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 void test(const S& s) { assert(s.max_size() >= s.size()); - { - S s2; - try { s2.resize(s2.max_size() - 1, 'x'); } - catch ( const std::bad_alloc & ) { return ; } - assert ( false ); - } + test1(s); + test2(s); + test3(s); } int main()