1 //===----------------------------------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // UNSUPPORTED: c++98, c++03, c++11, c++14
11 // UNSUPPORTED: libcpp-no-deduction-guides
12 //
13 // This feature is not yet ready in clang
14 // http://b/36401676
15 // XFAIL: *
16
17 // <string>
18
19 // Test that the constructors offered by std::basic_string are formulated
20 // so they're compatible with implicit deduction guides.
21
22 #include <string>
23 #include <string_view>
24 #include <cassert>
25
26 #include "test_macros.h"
27 #include "test_allocator.h"
28 #include "test_iterators.h"
29 #include "constexpr_char_traits.hpp"
30
31 template <class T, class Alloc = std::allocator<T>>
32 using BStr = std::basic_string<T, std::char_traits<T>, Alloc>;
33
34 // Overloads
35 // using A = Allocator;
36 // using BS = basic_string
37 // using BSV = basic_string_view
38 // ---------------
39 // (1) basic_string() - NOT TESTED
40 // (2) basic_string(A const&) - BROKEN
41 // (3) basic_string(size_type, CharT, const A& = A())
42 // (4) basic_string(BS const&, size_type, A const& = A())
43 // (5) basic_string(BS const&, size_type, size_type, A const& = A()) - PARTIALLY BROKEN
44 // (6) basic_string(const CharT*, size_type, A const& = A())
45 // (7) basic_string(const CharT*, A const& = A())
46 // (8) basic_string(InputIt, InputIt, A const& = A()) - BROKEN
47 // (9) basic_string(BS const&)
48 // (10) basic_string(BS const&, A const&)
49 // (11) basic_string(BS&&)
50 // (12) basic_string(BS&&, A const&)
51 // (13) basic_string(initializer_list<CharT>, A const& = A())
52 // (14) basic_string(BSV, A const& = A())
53 // (15) basic_string(const T&, size_type, size_type, A const& = A()) - BROKEN
main()54 int main()
55 {
56 using TestSizeT = test_allocator<char>::size_type;
57 { // Testing (1)
58 // Nothing TODO. Cannot deduce without any arguments.
59 }
60 { // Testing (2)
61 // This overload isn't compatible with implicit deduction guides as
62 // specified in the standard.
63 // const test_allocator<char> alloc{};
64 // std::basic_string s(alloc);
65 }
66 { // Testing (3) w/o allocator
67 std::basic_string s(6ull, 'a');
68 ASSERT_SAME_TYPE(decltype(s), std::string);
69 assert(s == "aaaaaa");
70
71 std::basic_string w(2ull, L'b');
72 ASSERT_SAME_TYPE(decltype(w), std::wstring);
73 assert(w == L"bb");
74 }
75 { // Testing (3) w/ allocator
76 std::basic_string s(6ull, 'a', test_allocator<char>{});
77 ASSERT_SAME_TYPE(decltype(s), BStr<char,test_allocator<char>>);
78 assert(s == "aaaaaa");
79
80 std::basic_string w(2ull, L'b', test_allocator<wchar_t>{});
81 ASSERT_SAME_TYPE(decltype(w), BStr<wchar_t, test_allocator<wchar_t>>);
82 assert(w == L"bb");
83 }
84 { // Testing (4) w/o allocator
85 const std::string sin("abc");
86 std::basic_string s(sin, (size_t)1);
87 ASSERT_SAME_TYPE(decltype(s), std::string);
88 assert(s == "bc");
89
90 using WStr = std::basic_string<wchar_t,
91 constexpr_char_traits<wchar_t>,
92 test_allocator<wchar_t>>;
93 const WStr win(L"abcdef");
94 std::basic_string w(win, (TestSizeT)3);
95 ASSERT_SAME_TYPE(decltype(w), WStr);
96 assert(w == L"def");
97 }
98 { // Testing (4) w/ allocator
99 const std::string sin("abc");
100 std::basic_string s(sin, (size_t)1, std::allocator<char>{});
101 ASSERT_SAME_TYPE(decltype(s), std::string);
102 assert(s == "bc");
103
104 using WStr = std::basic_string<wchar_t,
105 constexpr_char_traits<wchar_t>,
106 test_allocator<wchar_t>>;
107 const WStr win(L"abcdef");
108 std::basic_string w(win, (TestSizeT)3, test_allocator<wchar_t>{});
109 ASSERT_SAME_TYPE(decltype(w), WStr);
110 assert(w == L"def");
111 }
112 { // Testing (5) w/o allocator
113 #if 0 // FIXME: This doesn't work
114 const std::string sin("abc");
115 std::basic_string s(sin, (size_t)1, (size_t)3);
116 ASSERT_SAME_TYPE(decltype(s), std::string);
117 assert(s == "bc");
118
119 using WStr = std::basic_string<wchar_t,
120 constexpr_char_traits<wchar_t>,
121 test_allocator<wchar_t>>;
122 const WStr win(L"abcdef");
123 std::basic_string w(win, (TestSizeT)2, (TestSizeT)3);
124 ASSERT_SAME_TYPE(decltype(w), WStr);
125 assert(w == L"cde");
126 #endif
127 }
128 { // Testing (5) w/ allocator
129 const std::string sin("abc");
130 std::basic_string s(sin, (size_t)1, (size_t)3, std::allocator<char>{});
131 ASSERT_SAME_TYPE(decltype(s), std::string);
132 assert(s == "bc");
133
134 using WStr = std::basic_string<wchar_t,
135 constexpr_char_traits<wchar_t>,
136 test_allocator<wchar_t>>;
137 const WStr win(L"abcdef");
138 std::basic_string w(win, (TestSizeT)2, (TestSizeT)3, test_allocator<wchar_t>{});
139 ASSERT_SAME_TYPE(decltype(w), WStr);
140 assert(w == L"cde");
141 }
142 { // Testing (6) w/o allocator
143 std::basic_string s("abc", (size_t)2);
144 ASSERT_SAME_TYPE(decltype(s), std::string);
145 assert(s == "ab");
146
147 std::basic_string w(L"abcdef", (size_t)3);
148 ASSERT_SAME_TYPE(decltype(w), std::wstring);
149 assert(w == L"abc");
150 }
151 { // Testing (6) w/ allocator
152 std::basic_string s("abc", (size_t)2, std::allocator<char>{});
153 ASSERT_SAME_TYPE(decltype(s), std::string);
154 assert(s == "ab");
155
156 using WStr = std::basic_string<wchar_t,
157 std::char_traits<wchar_t>,
158 test_allocator<wchar_t>>;
159 std::basic_string w(L"abcdef", (TestSizeT)3, test_allocator<wchar_t>{});
160 ASSERT_SAME_TYPE(decltype(w), WStr);
161 assert(w == L"abc");
162 }
163 { // Testing (7) w/o allocator
164 std::basic_string s("abc");
165 ASSERT_SAME_TYPE(decltype(s), std::string);
166 assert(s == "abc");
167
168 std::basic_string w(L"abcdef");
169 ASSERT_SAME_TYPE(decltype(w), std::wstring);
170 assert(w == L"abcdef");
171 }
172 { // Testing (7) w/ allocator
173 std::basic_string s("abc", std::allocator<char>{});
174 ASSERT_SAME_TYPE(decltype(s), std::string);
175 assert(s == "abc");
176
177 using WStr = std::basic_string<wchar_t,
178 std::char_traits<wchar_t>,
179 test_allocator<wchar_t>>;
180 std::basic_string w(L"abcdef", test_allocator<wchar_t>{});
181 ASSERT_SAME_TYPE(decltype(w), WStr);
182 assert(w == L"abcdef");
183 }
184 { // (8) w/o allocator
185 // This overload isn't compatible with implicit deduction guides as
186 // specified in the standard.
187 // FIXME: Propose adding an explicit guide to the standard?
188 }
189 { // (8) w/ allocator
190 // This overload isn't compatible with implicit deduction guides as
191 // specified in the standard.
192 // FIXME: Propose adding an explicit guide to the standard?
193 #if 0
194 using It = input_iterator<const char*>;
195 const char* input = "abcdef";
196 std::basic_string s(It(input), It(input + 3), std::allocator<char>{});
197 ASSERT_SAME_TYPE(decltype(s), std::string);
198 #endif
199 }
200 { // Testing (9)
201 const std::string sin("abc");
202 std::basic_string s(sin);
203 ASSERT_SAME_TYPE(decltype(s), std::string);
204 assert(s == "abc");
205
206 using WStr = std::basic_string<wchar_t,
207 constexpr_char_traits<wchar_t>,
208 test_allocator<wchar_t>>;
209 const WStr win(L"abcdef");
210 std::basic_string w(win);
211 ASSERT_SAME_TYPE(decltype(w), WStr);
212 assert(w == L"abcdef");
213 }
214 { // Testing (10)
215 const std::string sin("abc");
216 std::basic_string s(sin, std::allocator<char>{});
217 ASSERT_SAME_TYPE(decltype(s), std::string);
218 assert(s == "abc");
219
220 using WStr = std::basic_string<wchar_t,
221 constexpr_char_traits<wchar_t>,
222 test_allocator<wchar_t>>;
223 const WStr win(L"abcdef");
224 std::basic_string w(win, test_allocator<wchar_t>{});
225 ASSERT_SAME_TYPE(decltype(w), WStr);
226 assert(w == L"abcdef");
227 }
228 { // Testing (11)
229 std::string sin("abc");
230 std::basic_string s(std::move(sin));
231 ASSERT_SAME_TYPE(decltype(s), std::string);
232 assert(s == "abc");
233
234 using WStr = std::basic_string<wchar_t,
235 constexpr_char_traits<wchar_t>,
236 test_allocator<wchar_t>>;
237 WStr win(L"abcdef");
238 std::basic_string w(std::move(win));
239 ASSERT_SAME_TYPE(decltype(w), WStr);
240 assert(w == L"abcdef");
241 }
242 { // Testing (12)
243 std::string sin("abc");
244 std::basic_string s(std::move(sin), std::allocator<char>{});
245 ASSERT_SAME_TYPE(decltype(s), std::string);
246 assert(s == "abc");
247
248 using WStr = std::basic_string<wchar_t,
249 constexpr_char_traits<wchar_t>,
250 test_allocator<wchar_t>>;
251 WStr win(L"abcdef");
252 std::basic_string w(std::move(win), test_allocator<wchar_t>{});
253 ASSERT_SAME_TYPE(decltype(w), WStr);
254 assert(w == L"abcdef");
255 }
256 { // Testing (13) w/o allocator
257 std::basic_string s({'a', 'b', 'c'});
258 ASSERT_SAME_TYPE(decltype(s), std::string);
259 assert(s == "abc");
260
261 std::basic_string w({L'a', L'b', L'c'});
262 ASSERT_SAME_TYPE(decltype(w), std::wstring);
263 assert(w == L"abc");
264 }
265 { // Testing (13) w/ allocator
266 std::basic_string s({'a', 'b', 'c'}, test_allocator<char>{});
267 ASSERT_SAME_TYPE(decltype(s), BStr<char, test_allocator<char>>);
268 assert(s == "abc");
269
270 std::basic_string w({L'a', L'b', L'c'}, test_allocator<wchar_t>{});
271 ASSERT_SAME_TYPE(decltype(w), BStr<wchar_t, test_allocator<wchar_t>>);
272 assert(w == L"abc");
273 }
274 { // Testing (14) w/o allocator
275 std::string_view sv("abc");
276 std::basic_string s(sv);
277 ASSERT_SAME_TYPE(decltype(s), std::string);
278 assert(s == "abc");
279
280 using Expect = std::basic_string<wchar_t, constexpr_char_traits<wchar_t>>;
281 std::basic_string_view<wchar_t, constexpr_char_traits<wchar_t>> BSV(L"abcdef");
282 std::basic_string w(BSV);
283 ASSERT_SAME_TYPE(decltype(w), Expect);
284 assert(w == L"abcdef");
285 }
286 { // Testing (14) w/ allocator
287 using ExpectS = std::basic_string<char, std::char_traits<char>, test_allocator<char>>;
288 std::string_view sv("abc");
289 std::basic_string s(sv, test_allocator<char>{});
290 ASSERT_SAME_TYPE(decltype(s), ExpectS);
291 assert(s == "abc");
292
293 using ExpectW = std::basic_string<wchar_t, constexpr_char_traits<wchar_t>,
294 test_allocator<wchar_t>>;
295 std::basic_string_view<wchar_t, constexpr_char_traits<wchar_t>> BSV(L"abcdef");
296 std::basic_string w(BSV, test_allocator<wchar_t>{});
297 ASSERT_SAME_TYPE(decltype(w), ExpectW);
298 assert(w == L"abcdef");
299 }
300 { // Testing (15)
301 // This overload isn't compatible with implicit deduction guides as
302 // specified in the standard.
303 }
304 }
305