diff --git a/libcxx/test/std/strings/basic.string/string.capacity/deallocate_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/deallocate_size.pass.cpp new file mode 100644 index 000000000000000..1203b2f3ec18f92 --- /dev/null +++ b/libcxx/test/std/strings/basic.string/string.capacity/deallocate_size.pass.cpp @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// + +// Make sure the size we allocate and deallocate match. See https://github.com/llvm/llvm-project/pull/90292. + +#include +#include +#include +#include + +#include "test_macros.h" + +static int allocated_; + +template +struct test_alloc { + typedef Sz size_type; + typedef typename std::make_signed::type difference_type; + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef typename std::add_lvalue_reference::type reference; + typedef typename std::add_lvalue_reference::type const_reference; + + template + struct rebind { + typedef test_alloc other; + }; + + TEST_CONSTEXPR_CXX14 pointer allocate(size_type n, const void* = nullptr) { + allocated_ += n; + return std::allocator().allocate(n); + } + + TEST_CONSTEXPR_CXX14 void deallocate(pointer p, size_type s) { + allocated_ -= s; + std::allocator().deallocate(p, s); + } +}; + +template +void test() { + for (int i = 1; i < 1000; ++i) { + using Str = std::basic_string, test_alloc >; + { + Str s(i, 't'); + assert(allocated_ == 0 || allocated_ >= i); + } + } + assert(allocated_ == 0); +} + +int main(int, char**) { + test(); + test(); + test(); + + return 0; +}