From d91a0b2e3300ae34892e649b5e35e242b173c7f5 Mon Sep 17 00:00:00 2001 From: achabense <60953653+achabense@users.noreply.github.com> Date: Fri, 8 Sep 2023 22:02:41 +0800 Subject: [PATCH 1/3] Fix usage of `_Allocate_at_least_helper` in `deque::_Growmap` --- stl/inc/deque | 8 +++++++- tests/std/tests/GH_003570_allocate_at_least/test.cpp | 11 ++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/stl/inc/deque b/stl/inc/deque index 2800f211443..fbdfb42e784 100644 --- a/stl/inc/deque +++ b/stl/inc/deque @@ -1557,9 +1557,15 @@ private: _Newsize *= 2; } + size_type _Allocsize = _Newsize; + size_type _Myboff = _Myoff() / _Block_size; - _Mapptr _Newmap = _Allocate_at_least_helper(_Almap, _Newsize); + _Mapptr _Newmap = _Allocate_at_least_helper(_Almap, _Allocsize); _Mapptr _Myptr = _Newmap + _Myboff; + _STL_ASSERT(_Allocsize >= _Newsize, "_Allocsize >= _Newsize"); + while (_Allocsize / 2 >= _Newsize) { + _Newsize *= 2; + } _Count = _Newsize - _Mapsize(); diff --git a/tests/std/tests/GH_003570_allocate_at_least/test.cpp b/tests/std/tests/GH_003570_allocate_at_least/test.cpp index 1814ff4e2bd..8a724340c9d 100644 --- a/tests/std/tests/GH_003570_allocate_at_least/test.cpp +++ b/tests/std/tests/GH_003570_allocate_at_least/test.cpp @@ -51,7 +51,7 @@ struct signalling_allocator { allocation_result allocate_at_least(size_t count) { allocate_at_least_signal.set(); - return {allocate(count * 2), count * 2}; + return {allocate(count * 2 + 1), count * 2 + 1}; } void deallocate(T* ptr, size_t) noexcept { @@ -72,10 +72,15 @@ void test_container() { } void test_deque() { - deque> d; - d.resize(100); + deque> d; + for (size_t i = 0; i < 100; i++) { + d.push_back(i); + } assert(allocate_at_least_signal.consume()); assert(d.size() == 100); + for (size_t i = 0; i < 100; i++) { + assert(d[i] == i); + } } void test_stream_overflow(auto& stream) { From 4e9f39c16324acfe2e3bc8f8726c596c415971b4 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 14 Sep 2023 17:37:22 -0700 Subject: [PATCH 2/3] Style: Avoid Yoda condition. --- stl/inc/deque | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/deque b/stl/inc/deque index fbdfb42e784..176b3116236 100644 --- a/stl/inc/deque +++ b/stl/inc/deque @@ -1563,7 +1563,7 @@ private: _Mapptr _Newmap = _Allocate_at_least_helper(_Almap, _Allocsize); _Mapptr _Myptr = _Newmap + _Myboff; _STL_ASSERT(_Allocsize >= _Newsize, "_Allocsize >= _Newsize"); - while (_Allocsize / 2 >= _Newsize) { + while (_Newsize <= _Allocsize / 2) { _Newsize *= 2; } From 2340798c5dd4d050255149b5f32d0d75de0fe5be Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 14 Sep 2023 17:38:15 -0700 Subject: [PATCH 3/3] Style: Prefer preincrement. --- tests/std/tests/GH_003570_allocate_at_least/test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/std/tests/GH_003570_allocate_at_least/test.cpp b/tests/std/tests/GH_003570_allocate_at_least/test.cpp index 8a724340c9d..37408cf4782 100644 --- a/tests/std/tests/GH_003570_allocate_at_least/test.cpp +++ b/tests/std/tests/GH_003570_allocate_at_least/test.cpp @@ -73,12 +73,12 @@ void test_container() { void test_deque() { deque> d; - for (size_t i = 0; i < 100; i++) { + for (size_t i = 0; i < 100; ++i) { d.push_back(i); } assert(allocate_at_least_signal.consume()); assert(d.size() == 100); - for (size_t i = 0; i < 100; i++) { + for (size_t i = 0; i < 100; ++i) { assert(d[i] == i); } }