Fix error handling in filesystem::is_empty
authorJonathan Wakely <jwakely@redhat.com>
Mon, 24 Oct 2016 16:45:55 +0000 (17:45 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 24 Oct 2016 16:45:55 +0000 (17:45 +0100)
* src/filesystem/ops.cc (is_empty): Fix error handling.
* testsuite/experimental/filesystem/operations/is_empty.cc: New test.

From-SVN: r241488

libstdc++-v3/ChangeLog
libstdc++-v3/src/filesystem/ops.cc

index bc9a215..e551d39 100644 (file)
@@ -1,5 +1,8 @@
 2016-10-24  Jonathan Wakely  <jwakely@redhat.com>
 
+       * src/filesystem/ops.cc (is_empty): Fix error handling.
+       * testsuite/experimental/filesystem/operations/is_empty.cc: New test.
+
        PR libstdc++/71337
        * src/filesystem/ops.cc (temp_directory_path): Pass error_code
        argument to other filesystem operations.
index 90c225b..d9a12df 100644 (file)
@@ -1022,20 +1022,24 @@ fs::hard_link_count(const path& p, error_code& ec) noexcept
 bool
 fs::is_empty(const path& p)
 {
-  return fs::is_directory(status(p))
-    ? fs::directory_iterator(p) == fs::directory_iterator()
-    : fs::file_size(p) == 0;
+  error_code ec;
+  bool e = is_empty(p, ec);
+  if (ec)
+    _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot check is file is empty",
+                                            p, ec));
+  return e;
 }
 
 bool
 fs::is_empty(const path& p, error_code& ec) noexcept
 {
   auto s = status(p, ec);
-  if (ec.value())
+  if (ec)
     return false;
-  return fs::is_directory(s)
+  bool empty = fs::is_directory(s)
     ? fs::directory_iterator(p, ec) == fs::directory_iterator()
     : fs::file_size(p, ec) == 0;
+  return ec ? false : empty;
 }
 
 fs::file_time_type