diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-10-26 16:20:04 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-10-26 16:20:04 +0100 |
commit | ec0b1056a751b70efb567dbb02fe8b386dc6362f (patch) | |
tree | 22a523c01df279c1901b90805f010c9a49cf1110 /libstdc++-v3/src | |
parent | ae51afc5a2041cf8acec1343db13346fa9a848b1 (diff) | |
download | gcc-ec0b1056a751b70efb567dbb02fe8b386dc6362f.zip gcc-ec0b1056a751b70efb567dbb02fe8b386dc6362f.tar.gz gcc-ec0b1056a751b70efb567dbb02fe8b386dc6362f.tar.bz2 |
Add recursive_directory_iterator::pop(error_code&)
* include/experimental/bits/fs_dir.h (recursive_directory_iterator):
Overload pop (LWG 2706).
* src/filesystem/dir.cc (recursive_directory_iterator::pop): Define
new overload.
* testsuite/experimental/filesystem/iterators/pop.cc: New test.
From-SVN: r241559
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r-- | libstdc++-v3/src/filesystem/dir.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/libstdc++-v3/src/filesystem/dir.cc b/libstdc++-v3/src/filesystem/dir.cc index bcd7dd0..9a63c4a 100644 --- a/libstdc++-v3/src/filesystem/dir.cc +++ b/libstdc++-v3/src/filesystem/dir.cc @@ -364,19 +364,33 @@ fs::recursive_directory_iterator::increment(error_code& ec) noexcept } void -fs::recursive_directory_iterator::pop() +fs::recursive_directory_iterator::pop(error_code& ec) { if (!_M_dirs) - _GLIBCXX_THROW_OR_ABORT(filesystem_error( - "cannot pop non-dereferenceable recursive directory iterator", - std::make_error_code(errc::invalid_argument))); + { + ec = std::make_error_code(errc::invalid_argument); + return; + } do { _M_dirs->pop(); if (_M_dirs->empty()) { _M_dirs.reset(); + ec.clear(); return; } - } while (!_M_dirs->top().advance(nullptr, _M_options)); + } while (!_M_dirs->top().advance(&ec, _M_options)); +} + +void +fs::recursive_directory_iterator::pop() +{ + error_code ec; + pop(ec); + if (ec) + _GLIBCXX_THROW_OR_ABORT(filesystem_error(_M_dirs + ? "recursive directory iterator cannot pop" + : "non-dereferenceable recursive directory iterator cannot pop", + ec)); } |