1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // Requires 396145d in the built library.
10 // XFAIL: using-built-library-before-llvm-9
11 
12 // <istream>
13 
14 // template <class charT, class traits = char_traits<charT> >
15 //   class basic_istream;
16 
17 // operator>>(int& val);
18 
19 #include <istream>
20 #include <limits>
21 #include <cassert>
22 #include <streambuf>
23 
24 #include "test_macros.h"
25 
26 template <class CharT>
27 struct testbuf
28     : public std::basic_streambuf<CharT>
29 {
30     typedef std::basic_string<CharT> string_type;
31     typedef std::basic_streambuf<CharT> base;
32 private:
33     string_type str_;
34 public:
35 
36     testbuf() {}
37     testbuf(const string_type& str)
38         : str_(str)
39     {
40         base::setg(const_cast<CharT*>(str_.data()),
41                    const_cast<CharT*>(str_.data()),
42                    const_cast<CharT*>(str_.data()) + str_.size());
43     }
44 
45     CharT* eback() const {return base::eback();}
46     CharT* gptr() const {return base::gptr();}
47     CharT* egptr() const {return base::egptr();}
48 };
49 
50 int main(int, char**)
51 {
52     {
53         std::istream is((std::streambuf*)0);
54         int n = 0;
55         is >> n;
56         assert(is.fail());
57     }
58     {
59         testbuf<char> sb("0");
60         std::istream is(&sb);
61         int n = 10;
62         is >> n;
63         assert(n == 0);
64         assert( is.eof());
65         assert(!is.fail());
66     }
67     {
68         testbuf<char> sb(" 123 ");
69         std::istream is(&sb);
70         int n = 10;
71         is >> n;
72         assert(n == 123);
73         assert(!is.eof());
74         assert(!is.fail());
75     }
76 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
77     {
78         testbuf<wchar_t> sb(L" -1234567890123456 ");
79         std::wistream is(&sb);
80         int n = 10;
81         is >> n;
82         assert(n == std::numeric_limits<int>::min());
83         assert(!is.eof());
84         assert( is.fail());
85     }
86 #endif
87 #ifndef TEST_HAS_NO_EXCEPTIONS
88     {
89         testbuf<char> sb;
90         std::basic_istream<char> is(&sb);
91         is.exceptions(std::ios_base::failbit);
92 
93         bool threw = false;
94         try {
95             int n = 0;
96             is >> n;
97         } catch (std::ios_base::failure const&) {
98             threw = true;
99         }
100 
101         assert(!is.bad());
102         assert(is.fail());
103         assert(is.eof());
104         assert(threw);
105     }
106     {
107         testbuf<char> sb;
108         std::basic_istream<char> is(&sb);
109         is.exceptions(std::ios_base::eofbit);
110 
111         bool threw = false;
112         try {
113             int n = 0;
114             is >> n;
115         } catch (std::ios_base::failure const&) {
116             threw = true;
117         }
118 
119         assert(!is.bad());
120         assert(is.fail());
121         assert(is.eof());
122         assert(threw);
123     }
124 #endif // TEST_HAS_NO_EXCEPTIONS
125 
126     return 0;
127 }
128