74 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <ostream>10 11// template <class charT, class traits = char_traits<charT> >12// class basic_ostream;13 14// basic_ostream<charT,traits>& seekp(off_type off, ios_base::seekdir dir);15 16#include <ostream>17#include <cassert>18 19#include "test_macros.h"20 21int seekoff_called = 0;22 23template <class CharT>24struct testbuf25 : public std::basic_streambuf<CharT>26{27 typedef std::basic_streambuf<CharT> base;28 testbuf() {}29 30protected:31 32 typename base::pos_type33 seekoff(typename base::off_type off, std::ios_base::seekdir way,34 std::ios_base::openmode which)35 {36 ++seekoff_called;37 assert(way == std::ios_base::beg);38 assert(which == std::ios_base::out);39 return off;40 }41};42 43int main(int, char**)44{45 {46 seekoff_called = 0;47 std::ostream os((std::streambuf*)0);48 assert(&os.seekp(5, std::ios_base::beg) == &os);49 assert(seekoff_called == 0);50 }51 {52 seekoff_called = 0;53 testbuf<char> sb;54 std::ostream os(&sb);55 assert(&os.seekp(10, std::ios_base::beg) == &os);56 assert(seekoff_called == 1);57 assert(os.good());58 assert(&os.seekp(-1, std::ios_base::beg) == &os);59 assert(seekoff_called == 2);60 assert(os.fail());61 }62 { // See https://llvm.org/PR2136163 seekoff_called = 0;64 testbuf<char> sb;65 std::ostream os(&sb);66 os.setstate(std::ios_base::eofbit);67 assert(&os.seekp(10, std::ios_base::beg) == &os);68 assert(seekoff_called == 1);69 assert(os.rdstate() == std::ios_base::eofbit);70 }71 72 return 0;73}74