//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // int_type pbackfail(int_type c = traits::eof()); // FILE_DEPENDENCIES: underflow.dat #include #include #include "test_macros.h" template struct test_buf : public std::basic_filebuf { typedef std::basic_filebuf base; typedef typename base::char_type char_type; typedef typename base::int_type int_type; typedef typename base::traits_type traits_type; char_type* eback() const {return base::eback();} char_type* gptr() const {return base::gptr();} char_type* egptr() const {return base::egptr();} void gbump(int n) {base::gbump(n);} virtual int_type pbackfail(int_type c = traits_type::eof()) {return base::pbackfail(c);} }; int main(int, char**) { { test_buf f; assert(f.open("underflow.dat", std::ios_base::in) != 0); assert(f.is_open()); assert(f.sbumpc() == '1'); assert(f.sgetc() == '2'); typename test_buf::int_type pbackResult = f.pbackfail('a'); LIBCPP_ASSERT(pbackResult == -1); if (pbackResult != -1) { assert(f.sbumpc() == 'a'); assert(f.sgetc() == '2'); } } { test_buf f; assert(f.open("underflow.dat", std::ios_base::in | std::ios_base::out) != 0); assert(f.is_open()); assert(f.sbumpc() == '1'); assert(f.sgetc() == '2'); typename test_buf::int_type pbackResult = f.pbackfail('a'); LIBCPP_ASSERT(pbackResult == 'a'); if (pbackResult != -1) { assert(f.sbumpc() == 'a'); assert(f.sgetc() == '2'); } } return 0; }