]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/5.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 27_io / basic_ostream / inserters_other / char / 5.cc
CommitLineData
3c39060d 1// 2003-09-22 Petur Runolfsson <peturr02@ru.is>
2
f1717362 3// Copyright (C) 2003-2016 Free Software Foundation, Inc.
3c39060d 4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
6bc9506f 8// Free Software Foundation; either version 3, or (at your option)
3c39060d 9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
6bc9506f 17// with this library; see the file COPYING3. If not see
18// <http://www.gnu.org/licenses/>.
3c39060d 19
20// 27.6.2.5.3 basic_ostream manipulator inserters
21//
22// _GLIBCXX_RESOLVE_LIB_DEFECTS
23// DR 60. What is a formatted input function?
24// Inserters for manipulators do not behave as formatted output functions.
25
26#include <ostream>
27#include <stdexcept>
28#include <testsuite_hooks.h>
29#include <testsuite_io.h>
30
31std::ostream& func1(std::ostream&)
32{ throw std::runtime_error(""); }
33
34std::ios& func2(std::ios&)
35{ throw std::runtime_error(""); }
36
37std::ios_base& func3(std::ios_base&)
38{ throw std::runtime_error(""); }
39
40template<typename T>
41void test(T& (*f)(T&))
42{
bb135391 43 bool test __attribute__((unused)) = true;
3c39060d 44
45 __gnu_test::sync_streambuf buf;
46 std::ostream os(&buf);
47
48 __gnu_test::sync_streambuf buf_tie;
49 std::ostream os_tie(&buf_tie);
50
51 // No sentry should be constructed so os.tie()->flush() should not be
52 // called.
53 os.tie(&os_tie);
54
55 try
56 {
57 os << f;
58 // Exceptions thrown by f should not be caught
59 VERIFY( false );
60 }
61 catch (std::runtime_error&)
62 {
63 }
64
65 // Exceptions thrown by f should not cause badbit to be set
66 VERIFY( os.good() );
67 VERIFY( !buf_tie.sync_called() );
68
69 // The manipulator should be called even if !os.good().
70 os.setstate(std::ios_base::eofbit);
71
72 try
73 {
74 os << f;
75 // Exceptions thrown by f should not be caught
76 VERIFY( false );
77 }
78 catch (std::runtime_error&)
79 {
80 }
81
82 // Exceptions thrown by f should not cause badbit to be set
83 VERIFY( os.rdstate() == std::ios_base::eofbit );
84 VERIFY( !buf_tie.sync_called() );
85}
86
87void test05()
88{
89 test(&func1);
90 test(&func2);
91 test(&func3);
92}
93
94int main()
95{
96 test05();
97 return 0;
98}