1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <streambuf>
11 
12 // template <class charT, class traits = char_traits<charT> >
13 // class basic_streambuf;
14 
15 // int_type sungetc();
16 
17 #include <streambuf>
18 #include <cassert>
19 
20 int pbackfail_called = 0;
21 
22 struct test
23     : public std::basic_streambuf<char>
24 {
25     typedef std::basic_streambuf<char> base;
26 
testtest27     test() {}
28 
setgtest29     void setg(char* gbeg, char* gnext, char* gend)
30     {
31         base::setg(gbeg, gnext, gend);
32     }
33 
34 protected:
pbackfailtest35     int_type pbackfail(int_type c = traits_type::eof())
36     {
37         ++pbackfail_called;
38         return 'a';
39     }
40 };
41 
main()42 int main()
43 {
44     {
45         test t;
46         assert(pbackfail_called == 0);
47         assert(t.sungetc() == 'a');
48         assert(pbackfail_called == 1);
49         char in[] = "ABC";
50         t.setg(in, in+1, in+sizeof(in));
51         assert(t.sungetc() == 'A');
52         assert(pbackfail_called == 1);
53         assert(t.sungetc() == 'a');
54         assert(pbackfail_called == 2);
55     }
56 }
57