Louis Dionne 7149bb7068 [libc++] NFC: Clean up a lot of old Lit features
The libc++ test suite has a lot of old Lit features used to XFAIL tests
and mark them as UNSUPPORTED. Many of them are to workaround problems on
old compilers or old platforms. As time goes by, it is good to go and
clean those up to simplify the configuration of the test suite, and also
to reflect the testing reality. It's not useful to have markup that gives
the impression that e.g. clang-3.3 is supported, when we don't really
test on it anymore (and hence several new tests probably don't have the
necessary markup on them).
2020-04-10 17:20:29 -04:00

137 lines
2.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>
// Split into two calls for C++20
// void reserve();
// void reserve(size_type res_arg);
#include <string>
#include <stdexcept>
#include <cassert>
#include "test_macros.h"
#include "min_allocator.h"
template <class S>
void
test(S s)
{
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());
}
template <class S>
void
test(S s, typename S::size_type res_arg)
{
typename S::size_type old_cap = s.capacity();
((void)old_cap); // Prevent unused warning
S s0 = s;
if (res_arg <= s.max_size())
{
s.reserve(res_arg);
assert(s == s0);
assert(s.capacity() >= res_arg);
assert(s.capacity() >= s.size());
#if TEST_STD_VER > 17
assert(s.capacity() >= old_cap); // resize never shrinks as of P0966
#endif
}
#ifndef TEST_HAS_NO_EXCEPTIONS
else
{
try
{
s.reserve(res_arg);
assert(false);
}
catch (std::length_error&)
{
assert(res_arg > s.max_size());
}
}
#endif
}
int main(int, char**)
{
{
typedef std::string S;
{
S s;
test(s);
s.assign(10, 'a');
s.erase(5);
test(s);
s.assign(100, 'a');
s.erase(50);
test(s);
}
{
S s;
test(s, 5);
test(s, 10);
test(s, 50);
}
{
S s(100, 'a');
s.erase(50);
test(s, 5);
test(s, 10);
test(s, 50);
test(s, 100);
test(s, 1000);
test(s, S::npos);
}
}
#if TEST_STD_VER >= 11
{
typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
{
S s;
test(s);
s.assign(10, 'a');
s.erase(5);
test(s);
s.assign(100, 'a');
s.erase(50);
test(s);
}
{
S s;
test(s, 5);
test(s, 10);
test(s, 50);
}
{
S s(100, 'a');
s.erase(50);
test(s, 5);
test(s, 10);
test(s, 50);
test(s, 100);
test(s, 1000);
test(s, S::npos);
}
}
#endif
return 0;
}