1053d81ceSMarshall Clow //===----------------------------------------------------------------------===// 2053d81ceSMarshall Clow // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6053d81ceSMarshall Clow // 7053d81ceSMarshall Clow //===----------------------------------------------------------------------===// 8053d81ceSMarshall Clow 9*425620ccSNikolas Klauser // XFAIL: LIBCXX-AIX-FIXME 10*425620ccSNikolas Klauser 11053d81ceSMarshall Clow // <string> 12053d81ceSMarshall Clow 13*425620ccSNikolas Klauser // explicit basic_string(basic_string_view<CharT, traits> sv, const Allocator& a = Allocator()); // constexpr since C++20 14053d81ceSMarshall Clow 15053d81ceSMarshall Clow #include <algorithm> 16053d81ceSMarshall Clow #include <cassert> 178ec49997SLouis Dionne #include <stdexcept> 188ec49997SLouis Dionne #include <string_view> 198ec49997SLouis Dionne #include <string> 208ec49997SLouis Dionne #include <type_traits> 21053d81ceSMarshall Clow 22053d81ceSMarshall Clow #include "min_allocator.h" 238ec49997SLouis Dionne #include "test_allocator.h" 248ec49997SLouis Dionne #include "test_macros.h" 258ec49997SLouis Dionne 268ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string const&>::value, ""); 278ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string>::value, ""); 28053d81ceSMarshall Clow 29053d81ceSMarshall Clow template <class charT> 3085e9b268SNikolas Klauser TEST_CONSTEXPR_CXX20 void 31053d81ceSMarshall Clow test(std::basic_string_view<charT> sv) 32053d81ceSMarshall Clow { 33053d81ceSMarshall Clow typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S; 34053d81ceSMarshall Clow typedef typename S::traits_type T; 35053d81ceSMarshall Clow typedef typename S::allocator_type A; 3638590b38SEric Fiselier { 37053d81ceSMarshall Clow S s2(sv); 38053d81ceSMarshall Clow LIBCPP_ASSERT(s2.__invariants()); 39053d81ceSMarshall Clow assert(s2.size() == sv.size()); 40053d81ceSMarshall Clow assert(T::compare(s2.data(), sv.data(), sv.size()) == 0); 41053d81ceSMarshall Clow assert(s2.get_allocator() == A()); 42053d81ceSMarshall Clow assert(s2.capacity() >= s2.size()); 43053d81ceSMarshall Clow } 4438590b38SEric Fiselier { 4538590b38SEric Fiselier S s2; 4638590b38SEric Fiselier s2 = sv; 4738590b38SEric Fiselier LIBCPP_ASSERT(s2.__invariants()); 4838590b38SEric Fiselier assert(s2.size() == sv.size()); 4938590b38SEric Fiselier assert(T::compare(s2.data(), sv.data(), sv.size()) == 0); 5038590b38SEric Fiselier assert(s2.get_allocator() == A()); 5138590b38SEric Fiselier assert(s2.capacity() >= s2.size()); 5238590b38SEric Fiselier } 5338590b38SEric Fiselier } 54053d81ceSMarshall Clow 55053d81ceSMarshall Clow template <class charT, class A> 5685e9b268SNikolas Klauser TEST_CONSTEXPR_CXX20 void 57053d81ceSMarshall Clow test(std::basic_string_view<charT> sv, const A& a) 58053d81ceSMarshall Clow { 59053d81ceSMarshall Clow typedef std::basic_string<charT, std::char_traits<charT>, A> S; 60053d81ceSMarshall Clow typedef typename S::traits_type T; 6138590b38SEric Fiselier { 62053d81ceSMarshall Clow S s2(sv, a); 63053d81ceSMarshall Clow LIBCPP_ASSERT(s2.__invariants()); 64053d81ceSMarshall Clow assert(s2.size() == sv.size()); 65053d81ceSMarshall Clow assert(T::compare(s2.data(), sv.data(), sv.size()) == 0); 66053d81ceSMarshall Clow assert(s2.get_allocator() == a); 67053d81ceSMarshall Clow assert(s2.capacity() >= s2.size()); 68053d81ceSMarshall Clow } 6938590b38SEric Fiselier { 7038590b38SEric Fiselier S s2(a); 7138590b38SEric Fiselier s2 = sv; 7238590b38SEric Fiselier LIBCPP_ASSERT(s2.__invariants()); 7338590b38SEric Fiselier assert(s2.size() == sv.size()); 7438590b38SEric Fiselier assert(T::compare(s2.data(), sv.data(), sv.size()) == 0); 7538590b38SEric Fiselier assert(s2.get_allocator() == a); 7638590b38SEric Fiselier assert(s2.capacity() >= s2.size()); 7738590b38SEric Fiselier } 7838590b38SEric Fiselier } 79053d81ceSMarshall Clow 80*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() { 81053d81ceSMarshall Clow { 82053d81ceSMarshall Clow typedef test_allocator<char> A; 83053d81ceSMarshall Clow typedef std::basic_string_view<char, std::char_traits<char> > SV; 84053d81ceSMarshall Clow 85053d81ceSMarshall Clow test(SV("")); 86053d81ceSMarshall Clow test(SV(""), A(2)); 87053d81ceSMarshall Clow 88053d81ceSMarshall Clow test(SV("1")); 89053d81ceSMarshall Clow test(SV("1") ,A(2)); 90053d81ceSMarshall Clow 91053d81ceSMarshall Clow test(SV("1234567980")); 92053d81ceSMarshall Clow test(SV("1234567980"), A(2)); 93053d81ceSMarshall Clow 94053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980")); 95053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980"), A(2)); 96053d81ceSMarshall Clow } 97053d81ceSMarshall Clow #if TEST_STD_VER >= 11 98053d81ceSMarshall Clow { 99053d81ceSMarshall Clow typedef min_allocator<char> A; 100053d81ceSMarshall Clow typedef std::basic_string_view<char, std::char_traits<char> > SV; 101053d81ceSMarshall Clow 102053d81ceSMarshall Clow test(SV("")); 103053d81ceSMarshall Clow test(SV(""), A()); 104053d81ceSMarshall Clow 105053d81ceSMarshall Clow test(SV("1")); 106053d81ceSMarshall Clow test(SV("1") ,A()); 107053d81ceSMarshall Clow 108053d81ceSMarshall Clow test(SV("1234567980")); 109053d81ceSMarshall Clow test(SV("1234567980"), A()); 110053d81ceSMarshall Clow 111053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980")); 112053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980"), A()); 113053d81ceSMarshall Clow } 114053d81ceSMarshall Clow #endif 1152df59c50SJF Bastien 116e85018b7SNikolas Klauser return true; 117e85018b7SNikolas Klauser } 118e85018b7SNikolas Klauser 119e85018b7SNikolas Klauser int main(int, char**) 120e85018b7SNikolas Klauser { 121e85018b7SNikolas Klauser test(); 122e85018b7SNikolas Klauser #if TEST_STD_VER > 17 123*425620ccSNikolas Klauser static_assert(test()); 124e85018b7SNikolas Klauser #endif 125e85018b7SNikolas Klauser 1262df59c50SJF Bastien return 0; 127053d81ceSMarshall Clow } 128