15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 95a83710eSEric Fiselier // <fstream> 105a83710eSEric Fiselier 115a83710eSEric Fiselier // int_type pbackfail(int_type c = traits::eof()); 125a83710eSEric Fiselier 13*df88d803SLouis Dionne // FILE_DEPENDENCIES: underflow.dat 14*df88d803SLouis Dionne 155a83710eSEric Fiselier #include <fstream> 165a83710eSEric Fiselier #include <cassert> 175a83710eSEric Fiselier 186e083f62SBilly Robert O'Neal III #include "test_macros.h" 196e083f62SBilly Robert O'Neal III 205a83710eSEric Fiselier template <class CharT> 215a83710eSEric Fiselier struct test_buf 225a83710eSEric Fiselier : public std::basic_filebuf<CharT> 235a83710eSEric Fiselier { 245a83710eSEric Fiselier typedef std::basic_filebuf<CharT> base; 255a83710eSEric Fiselier typedef typename base::char_type char_type; 265a83710eSEric Fiselier typedef typename base::int_type int_type; 275a83710eSEric Fiselier typedef typename base::traits_type traits_type; 285a83710eSEric Fiselier ebacktest_buf295a83710eSEric Fiselier char_type* eback() const {return base::eback();} gptrtest_buf305a83710eSEric Fiselier char_type* gptr() const {return base::gptr();} egptrtest_buf315a83710eSEric Fiselier char_type* egptr() const {return base::egptr();} gbumptest_buf325a83710eSEric Fiselier void gbump(int n) {base::gbump(n);} 335a83710eSEric Fiselier pbackfailtest_buf345a83710eSEric Fiselier virtual int_type pbackfail(int_type c = traits_type::eof()) {return base::pbackfail(c);} 355a83710eSEric Fiselier }; 365a83710eSEric Fiselier main(int,char **)372df59c50SJF Bastienint main(int, char**) 385a83710eSEric Fiselier { 395a83710eSEric Fiselier { 405a83710eSEric Fiselier test_buf<char> f; 415a83710eSEric Fiselier assert(f.open("underflow.dat", std::ios_base::in) != 0); 425a83710eSEric Fiselier assert(f.is_open()); 435a83710eSEric Fiselier assert(f.sbumpc() == '1'); 445a83710eSEric Fiselier assert(f.sgetc() == '2'); 456e083f62SBilly Robert O'Neal III typename test_buf<char>::int_type pbackResult = f.pbackfail('a'); 466e083f62SBilly Robert O'Neal III LIBCPP_ASSERT(pbackResult == -1); 476e083f62SBilly Robert O'Neal III if (pbackResult != -1) { 486e083f62SBilly Robert O'Neal III assert(f.sbumpc() == 'a'); 496e083f62SBilly Robert O'Neal III assert(f.sgetc() == '2'); 506e083f62SBilly Robert O'Neal III } 515a83710eSEric Fiselier } 525a83710eSEric Fiselier { 535a83710eSEric Fiselier test_buf<char> f; 545a83710eSEric Fiselier assert(f.open("underflow.dat", std::ios_base::in | std::ios_base::out) != 0); 555a83710eSEric Fiselier assert(f.is_open()); 565a83710eSEric Fiselier assert(f.sbumpc() == '1'); 575a83710eSEric Fiselier assert(f.sgetc() == '2'); 586e083f62SBilly Robert O'Neal III typename test_buf<char>::int_type pbackResult = f.pbackfail('a'); 596e083f62SBilly Robert O'Neal III LIBCPP_ASSERT(pbackResult == 'a'); 606e083f62SBilly Robert O'Neal III if (pbackResult != -1) { 615a83710eSEric Fiselier assert(f.sbumpc() == 'a'); 625a83710eSEric Fiselier assert(f.sgetc() == '2'); 635a83710eSEric Fiselier } 645a83710eSEric Fiselier } 652df59c50SJF Bastien 662df59c50SJF Bastien return 0; 676e083f62SBilly Robert O'Neal III } 68