Commit 854a5c77 by Jonathan Wakely Committed by Jonathan Wakely

PR libstdc++/90299 make filesystem::absolute overloads consistent

In this implementation it is an error to pass the empty path to absolute,
because the empty path doesn't represent any file in the filesystem so
the function cannot meet its postcondition.

Currently the absolute(const path&, error_code&) overload reports an
error for the empty path, but using errc::no_such_file_or_directory, and
the other overload does not report an error. This patch makes them
consistntly report an errc::invalid_argument error for the empty path.

	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.

From-SVN: r270874
parent 2f7f1aca
2019-05-04 Jonathan Wakely <jwakely@redhat.com> 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) * include/std/system_error (error_category, error_code)
(error_condition): Improve docs. (error_condition): Improve docs.
* libsupc++/exception: Add missing @addtogroup Doxygen command. * libsupc++/exception: Add missing @addtogroup Doxygen command.
......
...@@ -72,6 +72,9 @@ fs::absolute(const path& p) ...@@ -72,6 +72,9 @@ fs::absolute(const path& p)
ec)); ec));
return ret; return ret;
#else #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; return current_path() / p;
#endif #endif
} }
...@@ -82,7 +85,7 @@ fs::absolute(const path& p, error_code& ec) ...@@ -82,7 +85,7 @@ fs::absolute(const path& p, error_code& ec)
path ret; path ret;
if (p.empty()) if (p.empty())
{ {
ec = make_error_code(std::errc::no_such_file_or_directory); ec = make_error_code(std::errc::invalid_argument);
return ret; return ret;
} }
ec.clear(); ec.clear();
......
...@@ -67,9 +67,37 @@ test02() ...@@ -67,9 +67,37 @@ test02()
#endif #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 int
main() main()
{ {
test01(); test01();
test02(); test02();
test03();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment