//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03 // // ~basic_string() // implied noexcept; // constexpr since C++20 #include #include #include "test_macros.h" #include "test_allocator.h" template struct throwing_alloc { typedef T value_type; throwing_alloc(const throwing_alloc&); T* allocate(std::size_t); ~throwing_alloc() noexcept(false); }; // Test that it's possible to take the address of basic_string's destructors // by creating globals which will register their destructors with cxa_atexit. std::string unused_string; #ifndef TEST_HAS_NO_WIDE_CHARACTERS std::wstring unused_wide_string; #endif static_assert(std::is_nothrow_destructible::value, ""); static_assert( std::is_nothrow_destructible< std::basic_string, test_allocator>>::value, ""); LIBCPP_STATIC_ASSERT( !std::is_nothrow_destructible< std::basic_string, throwing_alloc>>::value, ""); TEST_CONSTEXPR_CXX20 bool test() { test_allocator_statistics alloc_stats; { std::basic_string, test_allocator> str2((test_allocator(&alloc_stats))); str2 = "long long string so no SSO"; assert(alloc_stats.alloc_count > 0); LIBCPP_ASSERT(alloc_stats.alloc_count == 1); } assert(alloc_stats.alloc_count == 0); return true; } int main(int, char**) { test(); #if TEST_STD_VER > 17 static_assert(test()); #endif return 0; }