//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // void reserve(size_type res_arg); // constexpr since C++20 // This test relies on https://llvm.org/PR45368 being fixed, which isn't in // older Apple dylibs // XFAIL: stdlib=apple-libc++ && target={{.+}}-apple-macosx{{10.9|10.10|10.11|10.12|10.13|10.14|10.15|11.0}} #include #include #include #include "test_macros.h" #include "min_allocator.h" template TEST_CONSTEXPR_CXX20 void test(typename S::size_type min_cap, typename S::size_type erased_index, typename S::size_type res_arg) { 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. #if TEST_STD_VER > 17 typename S::size_type old_cap = s.capacity(); #endif S s0 = s; if (res_arg <= s.max_size()) { s.reserve(res_arg); LIBCPP_ASSERT(s.__invariants()); assert(s == s0); assert(s.capacity() >= res_arg); assert(s.capacity() >= s.size()); #if TEST_STD_VER > 17 assert(s.capacity() >= old_cap); // reserve never shrinks as of P0966 (C++20) #endif } #ifndef TEST_HAS_NO_EXCEPTIONS else if (!TEST_IS_CONSTANT_EVALUATED) { try { s.reserve(res_arg); LIBCPP_ASSERT(s.__invariants()); assert(false); } catch (std::length_error&) { assert(res_arg > s.max_size()); } } #endif } template TEST_CONSTEXPR_CXX20 void test_string() { { test(0, 0, 5); test(0, 0, 10); test(0, 0, 50); } { test(100, 50, 5); test(100, 50, 10); test(100, 50, 50); test(100, 50, 100); test(100, 50, 1000); test(100, 50, S::npos); } } TEST_CONSTEXPR_CXX20 bool test() { test_string(); #if TEST_STD_VER >= 11 test_string, min_allocator>>(); #endif return true; } int main(int, char**) { test(); #if TEST_STD_VER > 17 static_assert(test()); #endif return 0; }