Make directory iterators become end iterator on error
authorJonathan Wakely <jwakely@redhat.com>
Mon, 24 Oct 2016 16:45:45 +0000 (17:45 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 24 Oct 2016 16:45:45 +0000 (17:45 +0100)
* 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
libstdc++-v3/src/filesystem/dir.cc
libstdc++-v3/testsuite/experimental/filesystem/iterators/directory_iterator.cc
libstdc++-v3/testsuite/experimental/filesystem/iterators/recursive_directory_iterator.cc

index 577c88f3ec8abbb1eaf89af54c986e7ef6225a8b..7c65fb0488161289a575c209b726018f0e02891c 100644 (file)
@@ -1,5 +1,18 @@
 2016-10-24  Jonathan Wakely  <jwakely@redhat.com>
 
+       * 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.
index 6ff12d04e9f83d545606269ee973a16ab15e9cc2..4640d751127130713ce70052653abc1623091654 100644 (file)
@@ -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<fs::_Dir*>(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));
     }
 }
 
index 5c80fb7ab4d1ba98187c72391a5067f68eb6312d..5788700317fc89429625a26bad70cafcad4547dc 100644 (file)
@@ -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;
index 37b26066774c8e3a947fb37b83dbb36c173fa2ff..b41c394b41a07a505c90336f682c89d44d741403 100644 (file)
@@ -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;