+2019-05-16 Jonathan Wakely <jwakely@redhat.com>
+
+ Backport from mainline
+ 2019-05-16 Jonathan Wakely <jwakely@redhat.com>
+
+ * src/c++17/fs_ops.cc (absolute(const path&, error_code&))
+ [_GLIBCXX_FILESYSTEM_IS_WINDOWS]: Remove bogus assertion.
+
+ Backport from mainline
+ 2019-05-04 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/90299
+ * src/c++17/fs_ops.cc (absolute(const path&)): Report an error if the
+ argument is an empty path.
+ (absolute(const path&, error_code&)): Use invalid_argument as error
+ code instead of no_such_file_or_directory.
+ * testsuite/27_io/filesystem/operations/absolute.cc: Check handling
+ of non-existent paths and empty paths with both overloads of absolute.
+
2019-05-15 Jonathan Wakely <jwakely@redhat.com>
Backport from mainline
ec));
return ret;
#else
+ if (p.empty())
+ _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot make absolute path", p,
+ make_error_code(std::errc::invalid_argument)));
return current_path() / p;
#endif
}
path ret;
if (p.empty())
{
- ec = make_error_code(std::errc::no_such_file_or_directory);
+ ec = make_error_code(std::errc::invalid_argument);
return ret;
}
ec.clear();
}
#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+ // s must remain null-terminated
wstring_view s = p.native();
if (p.has_root_directory()) // implies !p.has_root_name()
s.remove_prefix(std::min(s.length(), pos) - 1);
}
- // s must be null-terminated
- __glibcxx_assert(!s.empty() && s.back() == 0);
-
uint32_t len = 1024;
wstring buf;
do
#endif
}
+void
+test03()
+{
+ // PR libstdc++/90299
+ const path p = __gnu_test::nonexistent_path();
+ std::error_code ec;
+ const path pabs = absolute(p, ec);
+ VERIFY( !ec );
+ VERIFY( pabs.is_absolute() );
+
+ const path pabs2 = absolute(p);
+ VERIFY( pabs2 == pabs );
+
+ const path eabs = absolute(path{}, ec);
+ VERIFY( ec == std::errc::invalid_argument );
+ VERIFY( eabs.empty() );
+
+ try {
+ absolute(path{});
+ VERIFY( false );
+ } catch (const std::filesystem::filesystem_error& e) {
+ VERIFY( e.code() == std::errc::invalid_argument );
+ VERIFY( e.path1().empty() );
+ VERIFY( e.path2().empty() );
+ }
+}
+
int
main()
{
test01();
test02();
+ test03();
}