diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1513561bbd4..78f5df691d8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,11 @@ 2018-05-21 Jonathan Wakely + * src/filesystem/std-ops.cc (absolute): Report an error for empty + paths. + (weakly_canonical(const path&)): Do not call canonical on empty path. + (weakly_canonical(const path&, error_code&)): Likewise. + * testsuite/27_io/filesystem/operations/absolute.cc: Check for errors. + PR libstdc++/85818 * testsuite/experimental/filesystem/path/preferred_separator.cc: Add dg-require-filesystem-ts. diff --git a/libstdc++-v3/src/filesystem/std-ops.cc b/libstdc++-v3/src/filesystem/std-ops.cc index 74868cd48e6..00e4f987fc3 100644 --- a/libstdc++-v3/src/filesystem/std-ops.cc +++ b/libstdc++-v3/src/filesystem/std-ops.cc @@ -84,13 +84,20 @@ fs::absolute(const path& p) fs::path fs::absolute(const path& p, error_code& ec) { + path ret; + if (p.empty()) + { + ec = make_error_code(std::errc::no_such_file_or_directory); + return ret; + } #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS ec = std::make_error_code(errc::not_supported); - return {}; #else ec.clear(); - return current_path() / p; + ret = current_path(); + ret /= p; #endif + return ret; } namespace @@ -1513,7 +1520,8 @@ fs::weakly_canonical(const path& p) ++iter; } // canonicalize: - result = canonical(result); + if (!result.empty()) + result = canonical(result); // append the non-existing elements: while (iter != end) result /= *iter++; @@ -1551,7 +1559,7 @@ fs::weakly_canonical(const path& p, error_code& ec) ++iter; } // canonicalize: - if (!ec) + if (!ec && !result.empty()) result = canonical(result, ec); if (ec) result.clear(); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc b/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc index 4e472edd375..413a86758f0 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/operations/absolute.cc @@ -31,7 +31,11 @@ void test01() { for (const path& p : __gnu_test::test_paths) - VERIFY( absolute(p).is_absolute() ); + { + std::error_code ec; + path abs = absolute(p, ec); + VERIFY( ec || abs.is_absolute() ); + } } void