1*628fcfd5SNikolas Klauser //===----------------------------------------------------------------------===// 2*628fcfd5SNikolas Klauser // 3*628fcfd5SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*628fcfd5SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5*628fcfd5SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*628fcfd5SNikolas Klauser // 7*628fcfd5SNikolas Klauser //===----------------------------------------------------------------------===// 8*628fcfd5SNikolas Klauser 9*628fcfd5SNikolas Klauser // UNSUPPORTED: c++03 10*628fcfd5SNikolas Klauser 11*628fcfd5SNikolas Klauser // <string> 12*628fcfd5SNikolas Klauser 13*628fcfd5SNikolas Klauser // ~basic_string() // implied noexcept; 14*628fcfd5SNikolas Klauser 15*628fcfd5SNikolas Klauser #include <string> 16*628fcfd5SNikolas Klauser #include <cassert> 17*628fcfd5SNikolas Klauser 18*628fcfd5SNikolas Klauser #include "test_macros.h" 19*628fcfd5SNikolas Klauser #include "test_allocator.h" 20*628fcfd5SNikolas Klauser 21*628fcfd5SNikolas Klauser template <class T> 22*628fcfd5SNikolas Klauser struct throwing_alloc 23*628fcfd5SNikolas Klauser { 24*628fcfd5SNikolas Klauser typedef T value_type; 25*628fcfd5SNikolas Klauser throwing_alloc(const throwing_alloc&); 26*628fcfd5SNikolas Klauser T *allocate(size_t); 27*628fcfd5SNikolas Klauser ~throwing_alloc() noexcept(false); 28*628fcfd5SNikolas Klauser }; 29*628fcfd5SNikolas Klauser 30*628fcfd5SNikolas Klauser // Test that it's possible to take the address of basic_string's destructors 31*628fcfd5SNikolas Klauser // by creating globals which will register their destructors with cxa_atexit. 32*628fcfd5SNikolas Klauser std::string s; 33*628fcfd5SNikolas Klauser #ifndef TEST_HAS_NO_WIDE_CHARACTERS 34*628fcfd5SNikolas Klauser std::wstring ws; 35*628fcfd5SNikolas Klauser #endif 36*628fcfd5SNikolas Klauser 37*628fcfd5SNikolas Klauser static_assert(std::is_nothrow_destructible<std::string>::value, ""); 38*628fcfd5SNikolas Klauser static_assert(std::is_nothrow_destructible< 39*628fcfd5SNikolas Klauser std::basic_string<char, std::char_traits<char>, test_allocator<char>>>::value, ""); 40*628fcfd5SNikolas Klauser LIBCPP_STATIC_ASSERT(!std::is_nothrow_destructible< 41*628fcfd5SNikolas Klauser std::basic_string<char, std::char_traits<char>, throwing_alloc<char>>>::value, ""); 42*628fcfd5SNikolas Klauser 43*628fcfd5SNikolas Klauser bool test() { 44*628fcfd5SNikolas Klauser test_allocator_statistics alloc_stats; 45*628fcfd5SNikolas Klauser { 46*628fcfd5SNikolas Klauser std::basic_string<char, std::char_traits<char>, test_allocator<char>> str2((test_allocator<char>(&alloc_stats))); 47*628fcfd5SNikolas Klauser str2 = "long long string so no SSO"; 48*628fcfd5SNikolas Klauser assert(alloc_stats.alloc_count == 1); 49*628fcfd5SNikolas Klauser } 50*628fcfd5SNikolas Klauser assert(alloc_stats.alloc_count == 0); 51*628fcfd5SNikolas Klauser 52*628fcfd5SNikolas Klauser return true; 53*628fcfd5SNikolas Klauser } 54*628fcfd5SNikolas Klauser 55*628fcfd5SNikolas Klauser int main(int, char**) 56*628fcfd5SNikolas Klauser { 57*628fcfd5SNikolas Klauser test(); 58*628fcfd5SNikolas Klauser #if TEST_STD_VER > 17 59*628fcfd5SNikolas Klauser // static_assert(test()); 60*628fcfd5SNikolas Klauser #endif 61*628fcfd5SNikolas Klauser 62*628fcfd5SNikolas Klauser return 0; 63*628fcfd5SNikolas Klauser } 64