// Copyright (C) 2017-2023 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-do compile { target c++17 } } #include #include template using input_iterator_seq = __gnu_test::test_container; template struct require_same; template struct require_same { using type = void; }; template typename require_same::type check_type(U&) { } void test01() { std::string s0; std::allocator a; std::basic_string s1 = s0; check_type(s1); std::basic_string s2 = std::move(s0); check_type(s2); const std::basic_string s3 = s0; check_type(s3); const std::basic_string s4 = s3; check_type(s4); #if _GLIBCXX_USE_CXX11_ABI std::basic_string s5(s0, a); check_type(s5); std::basic_string s6(std::move(s0), a); check_type(s6); #endif std::basic_string s7(s0, 0, 0); check_type(s7); } void test02() { char a[1] = {}; input_iterator_seq seq(a); std::basic_string s1(seq.begin(), seq.end()); check_type(s1); std::basic_string s2(seq.begin(), seq.end(), std::allocator()); check_type(s2); std::basic_string s3((char)1, 'a'); check_type(s3); std::basic_string s4((char)1, 'a', std::allocator()); check_type(s4); } void test03() { char16_t a[1] = {}; input_iterator_seq seq(a); std::basic_string s1(seq.begin(), seq.end()); check_type(s1); std::basic_string s2(seq.begin(), seq.end(), std::allocator()); check_type(s2); std::basic_string s3((char16_t)1, u'a'); check_type(s3); std::basic_string s4((char16_t)1, u'a', std::allocator()); check_type(s4); } void test04() { char32_t a[1] = {}; input_iterator_seq seq(a); std::basic_string s1(seq.begin(), seq.end()); check_type(s1); std::basic_string s2(seq.begin(), seq.end(), std::allocator()); check_type(s2); std::basic_string s3((char32_t)1, U'a'); check_type(s3); std::basic_string s4((char32_t)1, U'a', std::allocator()); check_type(s4); } void test05() { #ifdef _GLIBCXX_USE_CHAR8_T char8_t a[1] = {}; input_iterator_seq seq(a); std::basic_string s1(seq.begin(), seq.end()); check_type(s1); std::basic_string s2(seq.begin(), seq.end(), std::allocator()); check_type(s2); std::basic_string s3((char8_t)1, u8'a'); check_type(s3); std::basic_string s4((char8_t)1, u8'a', std::allocator()); check_type(s4); #endif } void test06() { // LWG 3075 basic_string needs deduction guides from basic_string_view std::string_view sv{"A View to a Kill"}; const std::allocator a; std::basic_string s1(sv); check_type(s1); std::basic_string s2(sv, a); check_type(s2); std::basic_string s3(sv, 2u, 6u); check_type(s3); std::basic_string s4(sv, 2u, 6u, a); check_type(s4); } void test07() { // LWG 3076 basic_string CTAD ambiguity using namespace std; string s0; basic_string s1(s0, 1, 1); check_type(s1); basic_string s2("cat"sv, 1, 1); check_type(s2); basic_string s3("cat", 1); check_type(s3); }