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(ios_base::openmode which = ios_base::out | ios_base::in); // before C++20
150b8c8bc8SPiotr Fusik // basic_stringstream() : basic_stringstream(ios_base::out | ios_base::in) {}            // C++20
160b8c8bc8SPiotr Fusik // explicit basic_stringstream(ios_base::openmode which);                                // C++20
170b8c8bc8SPiotr Fusik 
18*b9a2658aSNikolas Klauser // XFAIL: FROZEN-CXX03-HEADERS-FIXME
19*b9a2658aSNikolas Klauser 
200b8c8bc8SPiotr Fusik #include <sstream>
210b8c8bc8SPiotr Fusik #include <cassert>
220b8c8bc8SPiotr Fusik 
230b8c8bc8SPiotr Fusik #include "test_macros.h"
244dee6411SMark de Wever #include "operator_hijacker.h"
250b8c8bc8SPiotr Fusik #if TEST_STD_VER >= 11
260b8c8bc8SPiotr Fusik #include "test_convertible.h"
270b8c8bc8SPiotr Fusik 
280b8c8bc8SPiotr Fusik template <typename S>
290b8c8bc8SPiotr Fusik void test() {
300b8c8bc8SPiotr Fusik   static_assert(test_convertible<S>(), "");
310b8c8bc8SPiotr Fusik   static_assert(!test_convertible<S, std::ios_base::openmode>(), "");
320b8c8bc8SPiotr Fusik }
330b8c8bc8SPiotr Fusik #endif
340b8c8bc8SPiotr Fusik 
350b8c8bc8SPiotr Fusik int main(int, char**)
360b8c8bc8SPiotr Fusik {
370b8c8bc8SPiotr Fusik     {
380b8c8bc8SPiotr Fusik         std::stringstream ss;
394dee6411SMark de Wever         assert(ss.rdbuf() != nullptr);
404dee6411SMark de Wever         assert(ss.good());
414dee6411SMark de Wever         assert(ss.str() == "");
424dee6411SMark de Wever     }
434dee6411SMark de Wever     {
444dee6411SMark de Wever       std::basic_stringstream<char, std::char_traits<char>, operator_hijacker_allocator<char> > ss;
454dee6411SMark de Wever       assert(ss.rdbuf() != nullptr);
460b8c8bc8SPiotr Fusik       assert(ss.good());
470b8c8bc8SPiotr Fusik       assert(ss.str() == "");
480b8c8bc8SPiotr Fusik     }
490b8c8bc8SPiotr Fusik     {
500b8c8bc8SPiotr Fusik         std::stringstream ss(std::ios_base::in);
514dee6411SMark de Wever         assert(ss.rdbuf() != nullptr);
524dee6411SMark de Wever         assert(ss.good());
534dee6411SMark de Wever         assert(ss.str() == "");
544dee6411SMark de Wever     }
554dee6411SMark de Wever     {
564dee6411SMark de Wever       std::basic_stringstream<char, std::char_traits<char>, operator_hijacker_allocator<char> > ss(std::ios_base::in);
574dee6411SMark de Wever       assert(ss.rdbuf() != nullptr);
580b8c8bc8SPiotr Fusik       assert(ss.good());
590b8c8bc8SPiotr Fusik       assert(ss.str() == "");
600b8c8bc8SPiotr Fusik     }
610b8c8bc8SPiotr Fusik #ifndef TEST_HAS_NO_WIDE_CHARACTERS
620b8c8bc8SPiotr Fusik     {
630b8c8bc8SPiotr Fusik         std::wstringstream ss;
644dee6411SMark de Wever         assert(ss.rdbuf() != nullptr);
650b8c8bc8SPiotr Fusik         assert(ss.good());
660b8c8bc8SPiotr Fusik         assert(ss.str() == L"");
670b8c8bc8SPiotr Fusik     }
680b8c8bc8SPiotr Fusik     {
690b8c8bc8SPiotr Fusik         std::wstringstream ss(std::ios_base::in);
704dee6411SMark de Wever         assert(ss.rdbuf() != nullptr);
710b8c8bc8SPiotr Fusik         assert(ss.good());
720b8c8bc8SPiotr Fusik         assert(ss.str() == L"");
730b8c8bc8SPiotr Fusik     }
740b8c8bc8SPiotr Fusik #endif
750b8c8bc8SPiotr Fusik 
760b8c8bc8SPiotr Fusik #if TEST_STD_VER >= 11
770b8c8bc8SPiotr Fusik     test<std::stringstream>();
780b8c8bc8SPiotr Fusik #  ifndef TEST_HAS_NO_WIDE_CHARACTERS
790b8c8bc8SPiotr Fusik     test<std::wstringstream>();
800b8c8bc8SPiotr Fusik #   endif
810b8c8bc8SPiotr Fusik #endif
820b8c8bc8SPiotr Fusik 
830b8c8bc8SPiotr Fusik     return 0;
840b8c8bc8SPiotr Fusik }
85