1// Copyright (C) 2003 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 2, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING.  If not, write to the Free
16// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17// USA.
18
19// 27.8.1.4 Overridden virtual functions
20
21#include <locale>
22#include <fstream>
23#include <testsuite_hooks.h>
24
25class Cvt : public std::codecvt<wchar_t, char, std::mbstate_t>
26{
27public:
28  mutable bool unshift_called;
29
30  Cvt()
31  : unshift_called(false)
32  { }
33
34protected:
35  bool
36  do_always_noconv() const throw()
37  { return false; }
38
39  int
40  do_encoding() const throw()
41  { return -1; }
42
43  std::codecvt_base::result
44  do_unshift(std::mbstate_t&, char* to, char*, char*& to_next) const
45  {
46    unshift_called = true;
47    to_next = to;
48    return std::codecvt_base::ok;
49  }
50};
51
52// libstdc++/12790
53// basic_filebuf::seekpos() should call codecvt::unshift(),
54// but only if writing
55void test01()
56{
57  using namespace std;
58
59  bool test __attribute__((unused)) = true;
60  const char* name = "tmp_seekpos_12790";
61
62  Cvt* cvt = new Cvt;
63  locale loc(locale::classic(), cvt);
64
65  wfilebuf fb;
66  fb.pubimbue(loc);
67
68  fb.open(name, ios_base::out);
69  streampos pos = fb.pubseekoff(0, ios_base::beg);
70
71  VERIFY( !cvt->unshift_called );
72  fb.pubseekpos(pos);
73  VERIFY( !cvt->unshift_called );
74}
75
76int main()
77{
78  test01();
79  return 0;
80}
81