
This patch fixes the implementation as well as the tests that didn't actually test the wanted behaviour. You'll find all the details in the bug report. It adds as well deprecation warning for reserve() (without argument) and adds a test. http://wg21.link/P0966R1 https://bugs.llvm.org/show_bug.cgi?id=45368 https://reviews.llvm.org/D54992 Reviewed By: ldionne, #libc Differential Revision: https://reviews.llvm.org/D91778
63 lines
1.4 KiB
C++
63 lines
1.4 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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.
|
|
|
|
// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
|
|
|
|
#include <string>
|
|
#include <stdexcept>
|
|
#include <cassert>
|
|
|
|
#include "test_macros.h"
|
|
#include "min_allocator.h"
|
|
|
|
template <class S>
|
|
void
|
|
test(typename S::size_type min_cap, typename S::size_type erased_index)
|
|
{
|
|
S s(min_cap, 'a');
|
|
s.erase(erased_index);
|
|
assert(s.size() == erased_index);
|
|
assert(s.capacity() >= min_cap); // Check that we really have at least this capacity.
|
|
|
|
typename S::size_type old_cap = s.capacity();
|
|
S s0 = s;
|
|
s.reserve();
|
|
LIBCPP_ASSERT(s.__invariants());
|
|
assert(s == s0);
|
|
assert(s.capacity() <= old_cap);
|
|
assert(s.capacity() >= s.size());
|
|
}
|
|
|
|
int main(int, char**)
|
|
{
|
|
{
|
|
typedef std::string S;
|
|
{
|
|
test<S>(0, 0);
|
|
test<S>(10, 5);
|
|
test<S>(100, 50);
|
|
}
|
|
}
|
|
#if TEST_STD_VER >= 11
|
|
{
|
|
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
|
|
{
|
|
test<S>(0, 0);
|
|
test<S>(10, 5);
|
|
test<S>(100, 50);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|