libstdc++: Reset filesystem::recursive_directory_iterator on error
authorJonathan Wakely <jwakely@redhat.com>
Mon, 31 Jan 2022 21:12:53 +0000 (21:12 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 1 Feb 2022 21:56:16 +0000 (21:56 +0000)
commitec09a5335f0ade7071f6157dfd97dbb3de3e4f97
treecca20f16242dda1452a0a0d179a859b097ecc767
parent90263a48303a5ae552ea04c68ed7fa5da49b1876
libstdc++: Reset filesystem::recursive_directory_iterator on error

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
libstdc++-v3/src/filesystem/dir.cc
libstdc++-v3/testsuite/27_io/filesystem/iterators/error_reporting.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/filesystem/iterators/error_reporting.cc [new file with mode: 0644]