Author: vaartis Date: Thu Jan 11 09:04:29 2018 New Revision: 322293 URL: http://llvm.org/viewvc/llvm-project?rev=322293&view=rev Log: Make std::experimental::filesystem::remove and remove_all return false or 0 if the file doesn't exist
Differential Revision: https://reviews.llvm.org/D41830 Modified: libcxx/trunk/src/experimental/filesystem/operations.cpp libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove/remove.pass.cpp libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove_all/remove_all.pass.cpp Modified: libcxx/trunk/src/experimental/filesystem/operations.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/experimental/filesystem/operations.cpp?rev=322293&r1=322292&r2=322293&view=diff ============================================================================== --- libcxx/trunk/src/experimental/filesystem/operations.cpp (original) +++ libcxx/trunk/src/experimental/filesystem/operations.cpp Thu Jan 11 09:04:29 2018 @@ -661,8 +661,10 @@ path __read_symlink(const path& p, std:: bool __remove(const path& p, std::error_code *ec) { if (ec) ec->clear(); + if (::remove(p.c_str()) == -1) { - set_or_throw(ec, "remove", p); + if (errno != ENOENT) + set_or_throw(ec, "remove", p); return false; } return true; @@ -692,13 +694,18 @@ std::uintmax_t remove_all_impl(path cons } // end namespace std::uintmax_t __remove_all(const path& p, std::error_code *ec) { + if (ec) ec->clear(); + std::error_code mec; auto count = remove_all_impl(p, mec); if (mec) { - set_or_throw(mec, ec, "remove_all", p); - return static_cast<std::uintmax_t>(-1); + if (mec == errc::no_such_file_or_directory) { + return 0; + } else { + set_or_throw(mec, ec, "remove_all", p); + return static_cast<std::uintmax_t>(-1); + } } - if (ec) ec->clear(); return count; } Modified: libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove/remove.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove/remove.pass.cpp?rev=322293&r1=322292&r2=322293&view=diff ============================================================================== --- libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove/remove.pass.cpp (original) +++ libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove/remove.pass.cpp Thu Jan 11 09:04:29 2018 @@ -61,17 +61,29 @@ TEST_CASE(test_error_reporting) const path file_in_bad_dir = env.create_file(bad_perms_dir / "file", 42); permissions(bad_perms_dir, perms::none); const path testCases[] = { - "", - env.make_env_path("dne"), non_empty_dir, file_in_bad_dir, }; for (auto& p : testCases) { std::error_code ec; + TEST_CHECK(!fs::remove(p, ec)); TEST_CHECK(ec); TEST_CHECK(checkThrow(p, ec)); } + + // PR#35780 + const path testCasesNonexistant[] = { + "", + env.make_env_path("dne") + }; + + for (auto& p : testCasesNonexistant) { + std::error_code ec; + + TEST_CHECK(!fs::remove(p, ec)); + TEST_CHECK(!ec); + } } TEST_CASE(basic_remove_test) Modified: libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove_all/remove_all.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove_all/remove_all.pass.cpp?rev=322293&r1=322292&r2=322293&view=diff ============================================================================== --- libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove_all/remove_all.pass.cpp (original) +++ libcxx/trunk/test/std/experimental/filesystem/fs.op.funcs/fs.op.remove_all/remove_all.pass.cpp Thu Jan 11 09:04:29 2018 @@ -64,16 +64,28 @@ TEST_CASE(test_error_reporting) permissions(bad_perms_file, perms::none); const path testCases[] = { - env.make_env_path("dne"), file_in_bad_dir }; const auto BadRet = static_cast<std::uintmax_t>(-1); for (auto& p : testCases) { std::error_code ec; + TEST_CHECK(fs::remove_all(p, ec) == BadRet); TEST_CHECK(ec); TEST_CHECK(checkThrow(p, ec)); } + + // PR#35780 + const path testCasesNonexistant[] = { + "", + env.make_env_path("dne") + }; + for (auto &p : testCasesNonexistant) { + std::error_code ec; + + TEST_CHECK(fs::remove_all(p) == 0); + TEST_CHECK(!ec); + } } TEST_CASE(basic_remove_all_test) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits