Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 1 | //===----------------------------------------------------------------------===// |
| 2 | // |
Chandler Carruth | 57b08b0 | 2019-01-19 10:56:40 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | // <string> |
| 10 | |
| 11 | // explicit basic_string(const Allocator& a = Allocator()); |
| 12 | |
| 13 | #include <string> |
| 14 | #include <cassert> |
| 15 | |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 16 | #include "test_macros.h" |
Marshall Clow | c3deeb5 | 2013-12-03 00:18:10 +0000 | [diff] [blame] | 17 | #include "test_allocator.h" |
Marshall Clow | e34f6f6 | 2013-11-26 20:58:02 +0000 | [diff] [blame] | 18 | #include "min_allocator.h" |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 19 | |
| 20 | template <class S> |
| 21 | void |
| 22 | test() |
| 23 | { |
| 24 | { |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 25 | #if TEST_STD_VER > 14 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 26 | static_assert((noexcept(S{})), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 27 | #elif TEST_STD_VER >= 11 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 28 | static_assert((noexcept(S()) == noexcept(typename S::allocator_type())), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 29 | #endif |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 30 | S s; |
Eric Fiselier | 1f4231f | 2016-04-28 22:28:23 +0000 | [diff] [blame] | 31 | LIBCPP_ASSERT(s.__invariants()); |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 32 | assert(s.data()); |
| 33 | assert(s.size() == 0); |
| 34 | assert(s.capacity() >= s.size()); |
| 35 | assert(s.get_allocator() == typename S::allocator_type()); |
| 36 | } |
| 37 | { |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 38 | #if TEST_STD_VER > 14 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 39 | static_assert((noexcept(S{typename S::allocator_type{}})), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 40 | #elif TEST_STD_VER >= 11 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 41 | static_assert((noexcept(S(typename S::allocator_type())) == std::is_nothrow_copy_constructible<typename S::allocator_type>::value), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 42 | #endif |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 43 | S s(typename S::allocator_type(5)); |
Eric Fiselier | 1f4231f | 2016-04-28 22:28:23 +0000 | [diff] [blame] | 44 | LIBCPP_ASSERT(s.__invariants()); |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 45 | assert(s.data()); |
| 46 | assert(s.size() == 0); |
| 47 | assert(s.capacity() >= s.size()); |
| 48 | assert(s.get_allocator() == typename S::allocator_type(5)); |
| 49 | } |
| 50 | } |
| 51 | |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 52 | #if TEST_STD_VER >= 11 |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 53 | |
| 54 | template <class S> |
| 55 | void |
| 56 | test2() |
| 57 | { |
| 58 | { |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 59 | #if TEST_STD_VER > 14 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 60 | static_assert((noexcept(S{})), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 61 | #elif TEST_STD_VER >= 11 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 62 | static_assert((noexcept(S()) == noexcept(typename S::allocator_type())), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 63 | #endif |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 64 | S s; |
Eric Fiselier | 1f4231f | 2016-04-28 22:28:23 +0000 | [diff] [blame] | 65 | LIBCPP_ASSERT(s.__invariants()); |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 66 | assert(s.data()); |
| 67 | assert(s.size() == 0); |
| 68 | assert(s.capacity() >= s.size()); |
| 69 | assert(s.get_allocator() == typename S::allocator_type()); |
| 70 | } |
| 71 | { |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 72 | #if TEST_STD_VER > 14 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 73 | static_assert((noexcept(S{typename S::allocator_type{}})), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 74 | #elif TEST_STD_VER >= 11 |
Stephan T. Lavavej | 4159db7 | 2017-07-29 00:55:10 +0000 | [diff] [blame] | 75 | static_assert((noexcept(S(typename S::allocator_type())) == std::is_nothrow_copy_constructible<typename S::allocator_type>::value), "" ); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 76 | #endif |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 77 | S s(typename S::allocator_type{}); |
Eric Fiselier | 1f4231f | 2016-04-28 22:28:23 +0000 | [diff] [blame] | 78 | LIBCPP_ASSERT(s.__invariants()); |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 79 | assert(s.data()); |
| 80 | assert(s.size() == 0); |
| 81 | assert(s.capacity() >= s.size()); |
| 82 | assert(s.get_allocator() == typename S::allocator_type()); |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | #endif |
| 87 | |
JF Bastien | 2df59c5 | 2019-02-04 20:31:13 +0000 | [diff] [blame] | 88 | int main(int, char**) |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 89 | { |
| 90 | test<std::basic_string<char, std::char_traits<char>, test_allocator<char> > >(); |
Marshall Clow | cbf166a | 2015-06-03 19:56:43 +0000 | [diff] [blame] | 91 | #if TEST_STD_VER >= 11 |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 92 | test2<std::basic_string<char, std::char_traits<char>, min_allocator<char> > >(); |
Marshall Clow | 2a10c96 | 2016-08-17 05:58:40 +0000 | [diff] [blame] | 93 | test2<std::basic_string<char, std::char_traits<char>, explicit_allocator<char> > >(); |
Howard Hinnant | eec7218 | 2013-06-28 16:59:19 +0000 | [diff] [blame] | 94 | #endif |
JF Bastien | 2df59c5 | 2019-02-04 20:31:13 +0000 | [diff] [blame] | 95 | |
| 96 | return 0; |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 +0000 | [diff] [blame] | 97 | } |