From bb52a7e324258d55eef28d2b1c473b3973507da2 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Mon, 24 Oct 2016 17:45:45 +0100 Subject: [PATCH] Make directory iterators become end iterator on error * src/filesystem/dir.cc (open_dir): Return same value for errors whether ignored or not. (_Dir::advance(error_code*, directory_options)): Return false on error. (directory_iterator(const path&, directory_options, error_code*)): Create end iterator on error (LWG 2723). (recursive_directory_iterator(const path&, directory_options, error_code*)): Likewise. * testsuite/experimental/filesystem/iterators/directory_iterator.cc: Update expected behaviour on error. * testsuite/experimental/filesystem/iterators/ recursive_directory_iterator.cc: Likewise. From-SVN: r241486 --- libstdc++-v3/ChangeLog | 13 +++++++++++++ libstdc++-v3/src/filesystem/dir.cc | 17 +++-------------- .../filesystem/iterators/directory_iterator.cc | 4 ++-- .../iterators/recursive_directory_iterator.cc | 4 ++-- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 577c88f3ec8..7c65fb04881 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,18 @@ 2016-10-24 Jonathan Wakely + * src/filesystem/dir.cc (open_dir): Return same value for errors + whether ignored or not. + (_Dir::advance(error_code*, directory_options)): Return false on + error. + (directory_iterator(const path&, directory_options, error_code*)): + Create end iterator on error (LWG 2723). + (recursive_directory_iterator(const path&, directory_options, + error_code*)): Likewise. + * testsuite/experimental/filesystem/iterators/directory_iterator.cc: + Update expected behaviour on error. + * testsuite/experimental/filesystem/iterators/ + recursive_directory_iterator.cc: Likewise. + * src/filesystem/ops.cc (close_fd): Remove. (do_copy_file): Just use close(3) instead of close_fd, to prevent retrying on error. diff --git a/libstdc++-v3/src/filesystem/dir.cc b/libstdc++-v3/src/filesystem/dir.cc index 6ff12d04e9f..4640d751127 100644 --- a/libstdc++-v3/src/filesystem/dir.cc +++ b/libstdc++-v3/src/filesystem/dir.cc @@ -79,8 +79,7 @@ namespace return (obj & bits) != Bitmask::none; } - // Returns {dirp, p} on success, {nullptr, p} on error. - // If an ignored EACCES error occurs returns {}. + // Returns {dirp, p} on success, {} on error (whether ignored or not). inline fs::_Dir open_dir(const fs::path& p, fs::directory_options options, std::error_code* ec) @@ -102,7 +101,7 @@ namespace std::error_code(err, std::generic_category()))); ec->assign(err, std::generic_category()); - return {nullptr, p}; + return {}; } inline fs::file_type @@ -169,7 +168,7 @@ fs::_Dir::advance(error_code* ec, directory_options options) "directory iterator cannot advance", std::error_code(err, std::generic_category()))); ec->assign(err, std::generic_category()); - return true; + return false; } else { @@ -191,12 +190,6 @@ directory_iterator(const path& p, directory_options options, error_code* ec) if (sp->advance(ec, options)) _M_dir.swap(sp); } - else if (!dir.path.empty()) - { - // An error occurred, we need a non-empty shared_ptr so that *this will - // not compare equal to the end iterator. - _M_dir.reset(static_cast(nullptr)); - } } const fs::directory_entry& @@ -270,10 +263,6 @@ recursive_directory_iterator(const path& p, directory_options options, std::error_code(err, std::generic_category()))); ec->assign(err, std::generic_category()); - - // An error occurred, we need a non-empty shared_ptr so that *this will - // not compare equal to the end iterator. - _M_dirs.reset(static_cast<_Dir_stack*>(nullptr)); } } diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc index 5c80fb7ab4d..5788700317f 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc @@ -34,7 +34,7 @@ test01() const auto p = __gnu_test::nonexistent_path(); fs::directory_iterator iter(p, ec); VERIFY( ec ); - VERIFY( iter != fs::directory_iterator() ); + VERIFY( iter == fs::directory_iterator() ); // Test empty directory. create_directory(p, fs::current_path(), ec); @@ -58,7 +58,7 @@ test01() VERIFY( !ec ); iter = fs::directory_iterator(p, ec); VERIFY( ec ); - VERIFY( iter != fs::directory_iterator() ); + VERIFY( iter == fs::directory_iterator() ); // Test inaccessible directory, skipping permission denied. const auto opts = fs::directory_options::skip_permission_denied; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc index 37b26066774..b41c394b41a 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc @@ -34,7 +34,7 @@ test01() const auto p = __gnu_test::nonexistent_path(); fs::recursive_directory_iterator iter(p, ec); VERIFY( ec ); - VERIFY( iter != fs::recursive_directory_iterator() ); + VERIFY( iter == fs::recursive_directory_iterator() ); // Test empty directory. create_directory(p, fs::current_path(), ec); @@ -60,7 +60,7 @@ test01() VERIFY( !ec ); iter = fs::recursive_directory_iterator(p, ec); VERIFY( ec ); - VERIFY( iter != fs::recursive_directory_iterator() ); + VERIFY( iter == fs::recursive_directory_iterator() ); // Test inaccessible directory, skipping permission denied. const auto opts = fs::directory_options::skip_permission_denied; -- 2.30.2