1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
11 // basic_string(const basic_string& str, const Allocator& alloc); // constexpr since C++20
16 #include "test_macros.h"
17 #include "test_allocator.h"
18 #include "min_allocator.h"
19 #include "asan_testing.h"
21 #ifndef TEST_HAS_NO_EXCEPTIONS
25 TEST_CONSTEXPR
alloc_imp() : active(true) {}
28 T
* allocate(std::size_t n
) {
30 return static_cast<T
*>(std::malloc(n
* sizeof(T
)));
32 throw std::bad_alloc();
36 void deallocate(T
* p
, std::size_t) {
39 void activate() { active
= true; }
40 void deactivate() { active
= false; }
46 typedef std::true_type propagate_on_container_copy_assignment
;
50 TEST_CONSTEXPR
poca_alloc(alloc_imp
* imp_
) : imp(imp_
) {}
53 TEST_CONSTEXPR
poca_alloc(const poca_alloc
<U
>& other
) : imp(other
.imp
) {}
55 T
* allocate(std::size_t n
) { return imp
->allocate
<T
>(n
); }
56 void deallocate(T
* p
, std::size_t n
) { imp
->deallocate(p
, n
); }
59 template <typename T
, typename U
>
60 bool operator==(const poca_alloc
<T
>& lhs
, const poca_alloc
<U
>& rhs
) {
61 return lhs
.imp
== rhs
.imp
;
64 template <typename T
, typename U
>
65 bool operator!=(const poca_alloc
<T
>& lhs
, const poca_alloc
<U
>& rhs
) {
66 return lhs
.imp
!= rhs
.imp
;
70 TEST_CONSTEXPR_CXX20
void test_assign(S
& s1
, const S
& s2
) {
73 } catch (std::bad_alloc
&) {
81 TEST_CONSTEXPR_CXX20
void test(S s1
, const typename
S::allocator_type
& a
) {
83 LIBCPP_ASSERT(s2
.__invariants());
85 assert(s2
.capacity() >= s2
.size());
86 assert(s2
.get_allocator() == a
);
87 LIBCPP_ASSERT(is_string_asan_correct(s1
));
88 LIBCPP_ASSERT(is_string_asan_correct(s2
));
91 template <class Alloc
>
92 TEST_CONSTEXPR_CXX20
void test_string(const Alloc
& a
) {
93 typedef std::basic_string
<char, std::char_traits
<char>, Alloc
> S
;
95 test(S("1"), Alloc(a
));
96 test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), Alloc(a
));
99 TEST_CONSTEXPR_CXX20
bool test() {
100 test_string(std::allocator
<char>());
101 test_string(test_allocator
<char>());
102 test_string(test_allocator
<char>(3));
103 #if TEST_STD_VER >= 11
104 test_string(min_allocator
<char>());
105 test_string(safe_allocator
<char>());
108 #if TEST_STD_VER >= 11
109 # ifndef TEST_HAS_NO_EXCEPTIONS
110 if (!TEST_IS_CONSTANT_EVALUATED
) {
111 typedef poca_alloc
<char> A
;
112 typedef std::basic_string
<char, std::char_traits
<char>, A
> S
;
113 const char* p1
= "This is my first string";
114 const char* p2
= "This is my second string";
135 int main(int, char**) {
137 #if TEST_STD_VER > 17
138 static_assert(test());