diff --git a/stl/inc/__msvc_filebuf.hpp b/stl/inc/__msvc_filebuf.hpp index 7e420846cfa..f06907a888c 100644 --- a/stl/inc/__msvc_filebuf.hpp +++ b/stl/inc/__msvc_filebuf.hpp @@ -651,8 +651,7 @@ class basic_filebuf : public basic_streambuf<_Elem, _Traits> { // stream buffer _Off -= static_cast(sizeof(_Elem)); // back up over _Elem bytes } - if (!_Myfile || !_Endwrite() - || ((_Off != 0 || _Way != ios_base::cur) && _CSTD _fseeki64(_Myfile, _Off, _Way) != 0) + if (!_Myfile || !_Endwrite() || _CSTD _fseeki64(_Myfile, _Off, _Way) != 0 || _CSTD fgetpos(_Myfile, &_Fileposition) != 0) { return pos_type{off_type{-1}}; // report failure } diff --git a/tests/std/test.lst b/tests/std/test.lst index 822cf153b82..094f4c7d4fe 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -223,6 +223,7 @@ tests\GH_003105_piecewise_densities tests\GH_003119_error_category_ctor tests\GH_003246_cmath_narrowing tests\GH_003570_allocate_at_least +tests\GH_003572_fstream_seekp_0_cur tests\GH_003617_vectorized_meow_element tests\GH_003676_format_large_hh_mm_ss_values tests\GH_003735_char_traits_signatures diff --git a/tests/std/tests/GH_003572_fstream_seekp_0_cur/env.lst b/tests/std/tests/GH_003572_fstream_seekp_0_cur/env.lst new file mode 100644 index 00000000000..19f025bd0e6 --- /dev/null +++ b/tests/std/tests/GH_003572_fstream_seekp_0_cur/env.lst @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +RUNALL_INCLUDE ..\usual_matrix.lst diff --git a/tests/std/tests/GH_003572_fstream_seekp_0_cur/test.cpp b/tests/std/tests/GH_003572_fstream_seekp_0_cur/test.cpp new file mode 100644 index 00000000000..72d15f50bcb --- /dev/null +++ b/tests/std/tests/GH_003572_fstream_seekp_0_cur/test.cpp @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include +#include +#include + +int main() { + using namespace std; + + fstream f("test.txt", ios::in | ios::out | ios::trunc); + + f << "123"; + + auto check = [&f](const char(&content)[4]) { + char buffer[4]{}; + f.seekg(0); + f.read(buffer, 3); + assert(f); + assert(memcmp(buffer, content, 4) == 0); + }; + + f.seekg(0); + (void) f.get(); + f.seekp(f.tellp()); + f << "*"; + check("1*3"); + + f.seekg(0); + (void) f.get(); + f.seekp(0, ios::cur); + f << "!"; + check("1!3"); + + f.seekg(0); + (void) f.get(); + f.seekp(1, ios::cur); + f << "!"; + check("1!!"); + + f.seekg(0); + (void) f.get(); + f.seekp(-1, ios::cur); + f << "!"; + check("!!!"); +}