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.
+
* include/std/system_error (error_category, error_code)
(error_condition): Improve docs.
* libsupc++/exception: Add missing @addtogroup Doxygen command.
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();
#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();
}