]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix error reporting for filesystem::rename on Windows [PR122726]
authorJonathan Wakely <jwakely@redhat.com>
Mon, 17 Nov 2025 21:01:33 +0000 (21:01 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 17 Nov 2025 21:18:24 +0000 (21:18 +0000)
Use the __last_system_error() function and the system_category to
convert the Windows error to a generic one.

libstdc++-v3/ChangeLog:

PR libstdc++/122726
* src/filesystem/ops-common.h [_GLIBCXX_FILESYSTEM_IS_WINDOWS]
(rename): Use __last_system_error to set errno accurately.
* testsuite/27_io/filesystem/operations/rename.cc: Test
error_code matches errc::no_such_file_or_directory.

libstdc++-v3/src/filesystem/ops-common.h
libstdc++-v3/testsuite/27_io/filesystem/operations/rename.cc

index 4feacfdb932d32e60a4b6812e7bfb92107522c99..ce7645db0ae8dfc23446cdbf6fe8a29f0ec736d9 100644 (file)
@@ -159,10 +159,7 @@ namespace __gnu_posix
     if (MoveFileExW(oldname, newname,
                    MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED))
       return 0;
-    if (GetLastError() == ERROR_ACCESS_DENIED)
-      errno = EACCES;
-    else
-      errno = EIO;
+    errno = std::__last_system_error().default_error_condition().value();
     return -1;
   }
 
index 00e088a10481e72d6838e0d8fa3770c8d0b64112..fef25472c3522e5ac76bdb08575b12d3edc033e9 100644 (file)
@@ -170,10 +170,20 @@ test_directories()
   fs::remove_all(dir, ec);
 }
 
+void
+test_pr122726()
+{
+  std::error_code ec;
+  const auto nonesuch = __gnu_test::nonexistent_path();
+  fs::rename(nonesuch, "new-name", ec);
+  VERIFY( ec == std::make_error_code(std::errc::no_such_file_or_directory) );
+}
+
 int
 main()
 {
   test01();
   test_symlinks();
   test_directories();
+  test_pr122726();
 }