https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118003

            Bug ID: 118003
           Summary: std::filesystem::remove_all() hangs on Windows on
                    directories containing a deep tree with long paths
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: martin at martin dot st
  Target Milestone: ---

To reproduce - create a deep tree where the total path name to the deepest
folders exceed the normal MAX_PATH. E.g. in msys2, do this:

$ mkdir -p
/tmp/file-system-test-ed4fa1/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss/DirNameWith19Charss

Then build the following test program, that tries to remove this directory
tree:

#include <filesystem>
#include <iostream>

int main(int argc, char* argv[]) {
  if (argc < 2) {
    std::cout << argv[0] << " dir" << std::endl;
    return 0;
  }
  std::filesystem::path Path(argv[1]);
  std::error_code EC;
  std::cout << "Path " << Path << std::endl;
  std::filesystem::remove_all(Path, EC);
  return 0;
}

Running this in msys2 like this:
$ ./fs-removeall.exe /tmp/file-system-test-ed4fa1
Path "C:/msys64/tmp/file-system-test-ed4fa1"

At this point, the program hangs, and doesn't complete. If we remove one level
of directories, so that the deepest point of the directory tree no longer
exceeds MAX_PATH, the program succeeds.


This situation was observed in an LLVM test, when attempting to use
std::filesystem::remove_all() for such operations, in
https://github.com/llvm/llvm-project/pull/119146.

The same operation succeeds with libc++ and MS STL.

Reply via email to