10b8c8bc8SPiotr Fusik //===----------------------------------------------------------------------===// 20b8c8bc8SPiotr Fusik // 30b8c8bc8SPiotr Fusik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b8c8bc8SPiotr Fusik // See https://llvm.org/LICENSE.txt for license information. 50b8c8bc8SPiotr Fusik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b8c8bc8SPiotr Fusik // 70b8c8bc8SPiotr Fusik //===----------------------------------------------------------------------===// 80b8c8bc8SPiotr Fusik 90b8c8bc8SPiotr Fusik // <sstream> 100b8c8bc8SPiotr Fusik 110b8c8bc8SPiotr Fusik // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 120b8c8bc8SPiotr Fusik // class basic_stringstream 130b8c8bc8SPiotr Fusik 140b8c8bc8SPiotr Fusik // explicit basic_stringstream(const basic_string<charT,traits,Allocator>& str, 150b8c8bc8SPiotr Fusik // ios_base::openmode which = ios_base::out|ios_base::in); 160b8c8bc8SPiotr Fusik 17*b9a2658aSNikolas Klauser // XFAIL: FROZEN-CXX03-HEADERS-FIXME 18*b9a2658aSNikolas Klauser 190b8c8bc8SPiotr Fusik #include <sstream> 200b8c8bc8SPiotr Fusik #include <cassert> 210b8c8bc8SPiotr Fusik 220b8c8bc8SPiotr Fusik #include "test_macros.h" 234dee6411SMark de Wever #include "operator_hijacker.h" 240b8c8bc8SPiotr Fusik 250b8c8bc8SPiotr Fusik template<typename T> 260b8c8bc8SPiotr Fusik struct NoDefaultAllocator : std::allocator<T> 270b8c8bc8SPiotr Fusik { 280b8c8bc8SPiotr Fusik template<typename U> struct rebind { using other = NoDefaultAllocator<U>; }; 290b8c8bc8SPiotr Fusik NoDefaultAllocator(int id_) : id(id_) { } 300b8c8bc8SPiotr Fusik template<typename U> NoDefaultAllocator(const NoDefaultAllocator<U>& a) : id(a.id) { } 310b8c8bc8SPiotr Fusik int id; 320b8c8bc8SPiotr Fusik }; 330b8c8bc8SPiotr Fusik 340b8c8bc8SPiotr Fusik 350b8c8bc8SPiotr Fusik int main(int, char**) 360b8c8bc8SPiotr Fusik { 370b8c8bc8SPiotr Fusik { 380b8c8bc8SPiotr Fusik std::stringstream ss(" 123 456 "); 394dee6411SMark de Wever assert(ss.rdbuf() != nullptr); 404dee6411SMark de Wever assert(ss.good()); 414dee6411SMark de Wever assert(ss.str() == " 123 456 "); 424dee6411SMark de Wever int i = 0; 434dee6411SMark de Wever ss >> i; 444dee6411SMark de Wever assert(i == 123); 454dee6411SMark de Wever ss >> i; 464dee6411SMark de Wever assert(i == 456); 474dee6411SMark de Wever ss << i << ' ' << 123; 484dee6411SMark de Wever assert(ss.str() == "456 1236 "); 494dee6411SMark de Wever } 504dee6411SMark de Wever { 514dee6411SMark de Wever std::basic_stringstream<char, std::char_traits<char>, operator_hijacker_allocator<char> > ss(" 123 456 "); 524dee6411SMark de Wever assert(ss.rdbuf() != nullptr); 530b8c8bc8SPiotr Fusik assert(ss.good()); 540b8c8bc8SPiotr Fusik assert(ss.str() == " 123 456 "); 550b8c8bc8SPiotr Fusik int i = 0; 560b8c8bc8SPiotr Fusik ss >> i; 570b8c8bc8SPiotr Fusik assert(i == 123); 580b8c8bc8SPiotr Fusik ss >> i; 590b8c8bc8SPiotr Fusik assert(i == 456); 600b8c8bc8SPiotr Fusik ss << i << ' ' << 123; 610b8c8bc8SPiotr Fusik assert(ss.str() == "456 1236 "); 620b8c8bc8SPiotr Fusik } 630b8c8bc8SPiotr Fusik #ifndef TEST_HAS_NO_WIDE_CHARACTERS 640b8c8bc8SPiotr Fusik { 650b8c8bc8SPiotr Fusik std::wstringstream ss(L" 123 456 "); 664dee6411SMark de Wever assert(ss.rdbuf() != nullptr); 674dee6411SMark de Wever assert(ss.good()); 684dee6411SMark de Wever assert(ss.str() == L" 123 456 "); 694dee6411SMark de Wever int i = 0; 704dee6411SMark de Wever ss >> i; 714dee6411SMark de Wever assert(i == 123); 724dee6411SMark de Wever ss >> i; 734dee6411SMark de Wever assert(i == 456); 744dee6411SMark de Wever ss << i << ' ' << 123; 754dee6411SMark de Wever assert(ss.str() == L"456 1236 "); 764dee6411SMark de Wever } 774dee6411SMark de Wever { 784dee6411SMark de Wever std::basic_stringstream<wchar_t, std::char_traits<wchar_t>, operator_hijacker_allocator<wchar_t> > ss( 794dee6411SMark de Wever L" 123 456 "); 804dee6411SMark de Wever assert(ss.rdbuf() != nullptr); 810b8c8bc8SPiotr Fusik assert(ss.good()); 820b8c8bc8SPiotr Fusik assert(ss.str() == L" 123 456 "); 830b8c8bc8SPiotr Fusik int i = 0; 840b8c8bc8SPiotr Fusik ss >> i; 850b8c8bc8SPiotr Fusik assert(i == 123); 860b8c8bc8SPiotr Fusik ss >> i; 870b8c8bc8SPiotr Fusik assert(i == 456); 880b8c8bc8SPiotr Fusik ss << i << ' ' << 123; 890b8c8bc8SPiotr Fusik assert(ss.str() == L"456 1236 "); 900b8c8bc8SPiotr Fusik } 910b8c8bc8SPiotr Fusik #endif 920b8c8bc8SPiotr Fusik { // This is https://llvm.org/PR33727 930b8c8bc8SPiotr Fusik typedef std::basic_string <char, std::char_traits<char>, NoDefaultAllocator<char> > S; 940b8c8bc8SPiotr Fusik typedef std::basic_stringbuf<char, std::char_traits<char>, NoDefaultAllocator<char> > SB; 950b8c8bc8SPiotr Fusik 960b8c8bc8SPiotr Fusik S s(NoDefaultAllocator<char>(1)); 970b8c8bc8SPiotr Fusik SB sb(s); 980b8c8bc8SPiotr Fusik // This test is not required by the standard, but *where else* could it get the allocator? 990b8c8bc8SPiotr Fusik assert(sb.str().get_allocator() == s.get_allocator()); 1000b8c8bc8SPiotr Fusik } 1010b8c8bc8SPiotr Fusik 1020b8c8bc8SPiotr Fusik return 0; 1030b8c8bc8SPiotr Fusik } 104