diff options
author | Eric Fiselier <eric@efcs.ca> | 2016-10-11 22:18:09 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2016-10-11 22:18:09 +0000 |
commit | e6364a35fd37177e6a628e4353e8af229d95d83d (patch) | |
tree | befe15464fbaf8d765cb48cef66db4d67bf5e904 /libcxx | |
parent | f4bab7eb66821af7030fe3e8c2d2ce73f07eac64 (diff) | |
download | bcm5719-llvm-e6364a35fd37177e6a628e4353e8af229d95d83d.tar.gz bcm5719-llvm-e6364a35fd37177e6a628e4353e8af229d95d83d.zip |
Fix LWG2683 - filesystem::copy() should always clear the user-provided error_code
llvm-svn: 283951
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/src/experimental/filesystem/operations.cpp | 8 | ||||
-rw-r--r-- | libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.copy/copy.pass.cpp | 32 | ||||
-rw-r--r-- | libcxx/www/cxx1z_status.html | 2 |
3 files changed, 30 insertions, 12 deletions
diff --git a/libcxx/src/experimental/filesystem/operations.cpp b/libcxx/src/experimental/filesystem/operations.cpp index 0420e12e3be..5d0a9a9dd30 100644 --- a/libcxx/src/experimental/filesystem/operations.cpp +++ b/libcxx/src/experimental/filesystem/operations.cpp @@ -236,12 +236,8 @@ void __copy(const path& from, const path& to, copy_options options, } return; } - else if (is_directory(f)) { - if (not bool(copy_options::recursive & options) && - bool(copy_options::__in_recursive_copy & options)) - { - return; - } + else if (is_directory(f) && (bool(copy_options::recursive & options) || + copy_options::none == options)) { if (!exists(t)) { // create directory to with attributes from 'from'. diff --git a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.copy/copy.pass.cpp b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.copy/copy.pass.cpp index 7d318719f74..61d963a510d 100644 --- a/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.copy/copy.pass.cpp +++ b/libcxx/test/std/experimental/filesystem/fs.op.funcs/fs.op.copy/copy.pass.cpp @@ -69,37 +69,44 @@ TEST_CASE(test_error_reporting) const path fifo = env.create_fifo("fifo"); TEST_REQUIRE(is_other(fifo)); + const auto test_ec = GetTestEC(); + // !exists(f) { - std::error_code ec; + std::error_code ec = test_ec; const path f = StaticEnv::DNE; const path t = env.test_root; fs::copy(f, t, ec); TEST_REQUIRE(ec); + TEST_REQUIRE(ec != test_ec); TEST_CHECK(checkThrow(f, t, ec)); } { // equivalent(f, t) == true - std::error_code ec; + std::error_code ec = test_ec; fs::copy(file, file, ec); TEST_REQUIRE(ec); + TEST_REQUIRE(ec != test_ec); TEST_CHECK(checkThrow(file, file, ec)); } { // is_directory(from) && is_file(to) - std::error_code ec; + std::error_code ec = test_ec; fs::copy(dir, file, ec); TEST_REQUIRE(ec); + TEST_REQUIRE(ec != test_ec); TEST_CHECK(checkThrow(dir, file, ec)); } { // is_other(from) - std::error_code ec; + std::error_code ec = test_ec; fs::copy(fifo, dir, ec); TEST_REQUIRE(ec); + TEST_REQUIRE(ec != test_ec); TEST_CHECK(checkThrow(fifo, dir, ec)); } { // is_other(to) - std::error_code ec; + std::error_code ec = test_ec; fs::copy(file, fifo, ec); TEST_REQUIRE(ec); + TEST_REQUIRE(ec != test_ec); TEST_CHECK(checkThrow(file, fifo, ec)); } } @@ -129,11 +136,13 @@ TEST_CASE(from_is_symlink) std::error_code ec = GetTestEC(); fs::copy(symlink, file, copy_options::copy_symlinks, ec); TEST_CHECK(ec); + TEST_CHECK(ec != GetTestEC()); } { // create symlinks but target exists std::error_code ec = GetTestEC(); fs::copy(symlink, file, copy_options::create_symlinks, ec); TEST_CHECK(ec); + TEST_CHECK(ec != GetTestEC()); } } @@ -246,6 +255,19 @@ TEST_CASE(from_is_directory) TEST_CHECK(file_size(nested_created) == FI.size); } } +} +TEST_CASE(test_otherwise_no_effects_clause) +{ + scoped_test_env env; + const path dir = env.create_dir("dir1"); + { // skip copy because of directory + const path dest = env.make_env_path("dest1"); + std::error_code ec; + fs::copy(dir, dest, CO::directories_only, ec); + TEST_CHECK(!ec); + TEST_CHECK(!exists(dest)); + } } + TEST_SUITE_END() diff --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html index 925d6a606f9..95c9d88c7c4 100644 --- a/libcxx/www/cxx1z_status.html +++ b/libcxx/www/cxx1z_status.html @@ -286,7 +286,7 @@ <tr><td><a href="http://wg21.link/LWG2671">2671</a></td><td>Errors in Copy</td><td>Oulu</td><td>Complete</td></tr> <tr><td><a href="http://wg21.link/LWG2673">2673</a></td><td>status() effects cannot be implemented as specified</td><td>Oulu</td><td>Complete</td></tr> <tr><td><a href="http://wg21.link/LWG2674">2674</a></td><td>Bidirectional iterator requirement on path::iterator is very expensive</td><td>Oulu</td><td>Complete</td></tr> - <tr><td><a href="http://wg21.link/LWG2683">2683</a></td><td>filesystem::copy() says "no effects"</td><td>Oulu</td><td></td></tr> + <tr><td><a href="http://wg21.link/LWG2683">2683</a></td><td>filesystem::copy() says "no effects"</td><td>Oulu</td><td>Complete</td></tr> <tr><td><a href="http://wg21.link/LWG2684">2684</a></td><td>priority_queue lacking comparator typedef</td><td>Oulu</td><td>Complete</td></tr> <tr><td><a href="http://wg21.link/LWG2685">2685</a></td><td>shared_ptr deleters must not throw on move construction</td><td>Oulu</td><td>Complete</td></tr> <tr><td><a href="http://wg21.link/LWG2687">2687</a></td><td>{inclusive,exclusive}_scan misspecified</td><td>Oulu</td><td></td></tr> |