diff --git a/stl/inc/__msvc_filebuf.hpp b/stl/inc/__msvc_filebuf.hpp index f06907a888c..7e420846cfa 100644 --- a/stl/inc/__msvc_filebuf.hpp +++ b/stl/inc/__msvc_filebuf.hpp @@ -651,7 +651,8 @@ class basic_filebuf : public basic_streambuf<_Elem, _Traits> { // stream buffer _Off -= static_cast(sizeof(_Elem)); // back up over _Elem bytes } - if (!_Myfile || !_Endwrite() || _CSTD _fseeki64(_Myfile, _Off, _Way) != 0 + if (!_Myfile || !_Endwrite() + || ((_Off != 0 || _Way != ios_base::cur) && _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 3059eef1402..5c0b3ca9533 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -223,10 +223,10 @@ tests\GH_003022_substr_allocator tests\GH_003105_piecewise_densities tests\GH_003119_error_category_ctor tests\GH_003246_cmath_narrowing -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 +tests\GH_003840_tellg_when_reading_lf_file_in_text_mode tests\LWG2381_num_get_floating_point tests\LWG2597_complex_branch_cut tests\LWG3018_shared_ptr_function 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 deleted file mode 100644 index 72d15f50bcb..00000000000 --- a/tests/std/tests/GH_003572_fstream_seekp_0_cur/test.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// 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("!!!"); -} diff --git a/tests/std/tests/GH_003572_fstream_seekp_0_cur/env.lst b/tests/std/tests/GH_003840_tellg_when_reading_lf_file_in_text_mode/env.lst similarity index 70% rename from tests/std/tests/GH_003572_fstream_seekp_0_cur/env.lst rename to tests/std/tests/GH_003840_tellg_when_reading_lf_file_in_text_mode/env.lst index 19f025bd0e6..2de7aab2959 100644 --- a/tests/std/tests/GH_003572_fstream_seekp_0_cur/env.lst +++ b/tests/std/tests/GH_003840_tellg_when_reading_lf_file_in_text_mode/env.lst @@ -1,4 +1,4 @@ # Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -RUNALL_INCLUDE ..\usual_matrix.lst +RUNALL_INCLUDE ..\usual_17_matrix.lst diff --git a/tests/std/tests/GH_003840_tellg_when_reading_lf_file_in_text_mode/test.cpp b/tests/std/tests/GH_003840_tellg_when_reading_lf_file_in_text_mode/test.cpp new file mode 100644 index 00000000000..2482c9c6a1f --- /dev/null +++ b/tests/std/tests/GH_003840_tellg_when_reading_lf_file_in_text_mode/test.cpp @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include +#include +#include +#include + +#include "temp_file_name.hpp" + +using namespace std; + +void test(const string& temp_file_name_str, const ios_base::openmode mode) { + filesystem::remove(temp_file_name_str); + + { + ofstream out{temp_file_name_str, mode}; + out << "Line A\n"; + out << "Line B\n"; + out << "Line C\n"; + } + + { + ifstream in{temp_file_name_str}; + string line; + + assert(getline(in, line)); + assert(line == "Line A"); + (void) in.tellg(); + + assert(getline(in, line)); + assert(line == "Line B"); + (void) in.tellg(); + + assert(getline(in, line)); + assert(line == "Line C"); + (void) in.tellg(); + + assert(!getline(in, line)); + } + + filesystem::remove(temp_file_name_str); +} + +int main() { + const string temp_file_name_str = temp_file_name(); + + test(temp_file_name_str, ios_base::out); + test(temp_file_name_str, ios_base::binary); +}