On Tue, 1 Feb 2022 at 22:00, Jonathan Wakely via Libstdc++ wrote: > > The standard requires directory iterators to become equal to the end > iterator value if they report an error. Some members functions of > filesystem::recursive_directory_iterator fail to do that. > > libstdc++-v3/ChangeLog: > > * src/c++17/fs_dir.cc (recursive_directory_iterator::increment): > Reset state to past-the-end iterator on error. > (fs::recursive_directory_iterator::pop(error_code&)): Likewise. > (fs::recursive_directory_iterator::pop()): Check _M_dirs before > it might get reset. > * src/filesystem/dir.cc (recursive_directory_iterator): Likewise, > for the TS implementation. > * testsuite/27_io/filesystem/iterators/error_reporting.cc: New test. > * testsuite/experimental/filesystem/iterators/error_reporting.cc: New test. > --- > libstdc++-v3/src/c++17/fs_dir.cc | 12 +- > libstdc++-v3/src/filesystem/dir.cc | 12 +- > .../filesystem/iterators/error_reporting.cc | 135 +++++++++++++++++ > .../filesystem/iterators/error_reporting.cc | 136 ++++++++++++++++++ > 4 files changed, 291 insertions(+), 4 deletions(-) > create mode 100644 libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc > create mode 100644 libstdc++-v3/testsuite/experimental/filesystem/iterators/error_reporting.cc > [...] > + > +extern "C" struct dirent* readdir(DIR*) > +{ > + switch (choice) > + { > + case 1: > + global_dirent.d_ino = 999; > + global_dirent.d_type = DT_REG; These new tests should not use the d_type member unless it's actually present on the OS. Fixed by the attached patch. Tested x86_64-linux and mingw-w64, pushed to trunk.