* 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.
From-SVN: r260441
2018-05-21 Jonathan Wakely <jwakely@redhat.com>
+ * 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.
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
++iter;
}
// canonicalize:
- result = canonical(result);
+ if (!result.empty())
+ result = canonical(result);
// append the non-existing elements:
while (iter != end)
result /= *iter++;
++iter;
}
// canonicalize:
- if (!ec)
+ if (!ec && !result.empty())
result = canonical(result, ec);
if (ec)
result.clear();
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