15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
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
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <string>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
125a83710eSEric Fiselier //   basic_istream<charT,traits>&
135a83710eSEric Fiselier //   operator>>(basic_istream<charT,traits>& is,
145a83710eSEric Fiselier //              basic_string<charT,traits,Allocator>& str);
155a83710eSEric Fiselier 
165a83710eSEric Fiselier #include <string>
175a83710eSEric Fiselier #include <sstream>
185a83710eSEric Fiselier #include <cassert>
195a83710eSEric Fiselier 
205a83710eSEric Fiselier #include "min_allocator.h"
21396145d0SLouis Dionne #include "test_macros.h"
225a83710eSEric Fiselier 
main(int,char **)232df59c50SJF Bastien int main(int, char**)
245a83710eSEric Fiselier {
255a83710eSEric Fiselier     {
265a83710eSEric Fiselier         std::istringstream in("a bc defghij");
275a83710eSEric Fiselier         std::string s("initial text");
285a83710eSEric Fiselier         in >> s;
295a83710eSEric Fiselier         assert(in.good());
305a83710eSEric Fiselier         assert(s == "a");
315a83710eSEric Fiselier         assert(in.peek() == ' ');
325a83710eSEric Fiselier         in >> s;
335a83710eSEric Fiselier         assert(in.good());
345a83710eSEric Fiselier         assert(s == "bc");
355a83710eSEric Fiselier         assert(in.peek() == ' ');
365a83710eSEric Fiselier         in.width(3);
375a83710eSEric Fiselier         in >> s;
385a83710eSEric Fiselier         assert(in.good());
395a83710eSEric Fiselier         assert(s == "def");
405a83710eSEric Fiselier         assert(in.peek() == 'g');
415a83710eSEric Fiselier         in >> s;
425a83710eSEric Fiselier         assert(in.eof());
435a83710eSEric Fiselier         assert(s == "ghij");
445a83710eSEric Fiselier         in >> s;
455a83710eSEric Fiselier         assert(in.fail());
465a83710eSEric Fiselier     }
47*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
485a83710eSEric Fiselier     {
495a83710eSEric Fiselier         std::wistringstream in(L"a bc defghij");
505a83710eSEric Fiselier         std::wstring s(L"initial text");
515a83710eSEric Fiselier         in >> s;
525a83710eSEric Fiselier         assert(in.good());
535a83710eSEric Fiselier         assert(s == L"a");
545a83710eSEric Fiselier         assert(in.peek() == L' ');
555a83710eSEric Fiselier         in >> s;
565a83710eSEric Fiselier         assert(in.good());
575a83710eSEric Fiselier         assert(s == L"bc");
585a83710eSEric Fiselier         assert(in.peek() == L' ');
595a83710eSEric Fiselier         in.width(3);
605a83710eSEric Fiselier         in >> s;
615a83710eSEric Fiselier         assert(in.good());
625a83710eSEric Fiselier         assert(s == L"def");
635a83710eSEric Fiselier         assert(in.peek() == L'g');
645a83710eSEric Fiselier         in >> s;
655a83710eSEric Fiselier         assert(in.eof());
665a83710eSEric Fiselier         assert(s == L"ghij");
675a83710eSEric Fiselier         in >> s;
685a83710eSEric Fiselier         assert(in.fail());
695a83710eSEric Fiselier     }
70*f4c1258dSLouis Dionne #endif
71396145d0SLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
72396145d0SLouis Dionne     {
73396145d0SLouis Dionne         std::stringbuf sb;
74396145d0SLouis Dionne         std::istream is(&sb);
75396145d0SLouis Dionne         is.exceptions(std::ios::failbit);
76396145d0SLouis Dionne 
77396145d0SLouis Dionne         bool threw = false;
78396145d0SLouis Dionne         try {
79396145d0SLouis Dionne             std::string s;
80396145d0SLouis Dionne             is >> s;
81396145d0SLouis Dionne         } catch (std::ios::failure const&) {
82396145d0SLouis Dionne             threw = true;
83396145d0SLouis Dionne         }
84396145d0SLouis Dionne 
85396145d0SLouis Dionne         assert(!is.bad());
86396145d0SLouis Dionne         assert(is.fail());
87396145d0SLouis Dionne         assert(is.eof());
88396145d0SLouis Dionne         assert(threw);
89396145d0SLouis Dionne     }
90396145d0SLouis Dionne     {
91396145d0SLouis Dionne         std::stringbuf sb;
92396145d0SLouis Dionne         std::istream is(&sb);
93396145d0SLouis Dionne         is.exceptions(std::ios::eofbit);
94396145d0SLouis Dionne 
95396145d0SLouis Dionne         bool threw = false;
96396145d0SLouis Dionne         try {
97396145d0SLouis Dionne             std::string s;
98396145d0SLouis Dionne             is >> s;
99396145d0SLouis Dionne         } catch (std::ios::failure const&) {
100396145d0SLouis Dionne             threw = true;
101396145d0SLouis Dionne         }
102396145d0SLouis Dionne 
103396145d0SLouis Dionne         assert(!is.bad());
104396145d0SLouis Dionne         assert(is.fail());
105396145d0SLouis Dionne         assert(is.eof());
106396145d0SLouis Dionne         assert(threw);
107396145d0SLouis Dionne     }
108396145d0SLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
109f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
1105a83710eSEric Fiselier     {
1115a83710eSEric Fiselier         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
1125a83710eSEric Fiselier         std::istringstream in("a bc defghij");
1135a83710eSEric Fiselier         S s("initial text");
1145a83710eSEric Fiselier         in >> s;
1155a83710eSEric Fiselier         assert(in.good());
1165a83710eSEric Fiselier         assert(s == "a");
1175a83710eSEric Fiselier         assert(in.peek() == ' ');
1185a83710eSEric Fiselier         in >> s;
1195a83710eSEric Fiselier         assert(in.good());
1205a83710eSEric Fiselier         assert(s == "bc");
1215a83710eSEric Fiselier         assert(in.peek() == ' ');
1225a83710eSEric Fiselier         in.width(3);
1235a83710eSEric Fiselier         in >> s;
1245a83710eSEric Fiselier         assert(in.good());
1255a83710eSEric Fiselier         assert(s == "def");
1265a83710eSEric Fiselier         assert(in.peek() == 'g');
1275a83710eSEric Fiselier         in >> s;
1285a83710eSEric Fiselier         assert(in.eof());
1295a83710eSEric Fiselier         assert(s == "ghij");
1305a83710eSEric Fiselier         in >> s;
1315a83710eSEric Fiselier         assert(in.fail());
1325a83710eSEric Fiselier     }
133*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
1345a83710eSEric Fiselier     {
1355a83710eSEric Fiselier         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
1365a83710eSEric Fiselier         std::wistringstream in(L"a bc defghij");
1375a83710eSEric Fiselier         S s(L"initial text");
1385a83710eSEric Fiselier         in >> s;
1395a83710eSEric Fiselier         assert(in.good());
1405a83710eSEric Fiselier         assert(s == L"a");
1415a83710eSEric Fiselier         assert(in.peek() == L' ');
1425a83710eSEric Fiselier         in >> s;
1435a83710eSEric Fiselier         assert(in.good());
1445a83710eSEric Fiselier         assert(s == L"bc");
1455a83710eSEric Fiselier         assert(in.peek() == L' ');
1465a83710eSEric Fiselier         in.width(3);
1475a83710eSEric Fiselier         in >> s;
1485a83710eSEric Fiselier         assert(in.good());
1495a83710eSEric Fiselier         assert(s == L"def");
1505a83710eSEric Fiselier         assert(in.peek() == L'g');
1515a83710eSEric Fiselier         in >> s;
1525a83710eSEric Fiselier         assert(in.eof());
1535a83710eSEric Fiselier         assert(s == L"ghij");
1545a83710eSEric Fiselier         in >> s;
1555a83710eSEric Fiselier         assert(in.fail());
1565a83710eSEric Fiselier     }
157*f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
158*f4c1258dSLouis Dionne #endif // TEST_STD_VER >= 11
1592df59c50SJF Bastien 
1602df59c50SJF Bastien   return 0;
1615a83710eSEric Fiselier }
162