blob: feb9499eb00e4dc71f5e19033f63875a75876c70 [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// <string>
// void reserve(); // Deprecated in C++20.
// void reserve(size_type);
// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
// This test ensures that libc++ implements https://wg21.link/P0966R1 (reserve never shrinks)
// even before C++20. This is required in order to avoid ODR violations because basic_string::reserve(size)
// is compiled into the shared library. Hence, it needs to have the same definition in all Standard modes.
//
// However, note that reserve() does shrink, and it does so in all Standard modes.
//
// Reported as https://llvm.org/PR53170.
// reserve(n) used to shrink the string until https://llvm.org/D117332 was shipped.
// XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx{{10.9|10.10|10.11|10.12|10.13|10.14|10.15|11.0|12.0}}
#include <string>
#include <stdexcept>
#include <cassert>
#include "test_macros.h"
#include "min_allocator.h"
template <class S>
TEST_CONSTEXPR_CXX20 bool test() {
// Test that a call to reserve() does shrink the string.
if (!TEST_IS_CONSTANT_EVALUATED) {
S s(1000, 'a');
typename S::size_type old_cap = s.capacity();
s.resize(20);
assert(s.capacity() == old_cap);
s.reserve();
assert(s.capacity() < old_cap);
}
// Test that a call to reserve(smaller-than-capacity) never shrinks the string.
{
S s(1000, 'a');
typename S::size_type old_cap = s.capacity();
s.resize(20);
assert(s.capacity() == old_cap);
s.reserve(10);
assert(s.capacity() == old_cap);
}
// In particular, test that reserve(0) does NOT shrink the string.
{
S s(1000, 'a');
typename S::size_type old_cap = s.capacity();
s.resize(20);
assert(s.capacity() == old_cap);
s.reserve(0);
assert(s.capacity() == old_cap);
}
return true;
}
int main(int, char**) {
test<std::string>();
#if TEST_STD_VER >= 11
test<std::basic_string<char, std::char_traits<char>, min_allocator<char> > >();
#endif
#if TEST_STD_VER > 17
static_assert(test<std::string>());
#endif
return 0;
}