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
This commit is contained in:
Jonathan Wakely 2019-05-04 15:35:33 +01:00 committed by Jonathan Wakely
parent 2f7f1aca29
commit 854a5c7722
3 changed files with 40 additions and 1 deletions

View File

@ -1,5 +1,13 @@
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.

View File

@ -72,6 +72,9 @@ fs::absolute(const path& p)
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
}
@ -82,7 +85,7 @@ fs::absolute(const path& p, error_code& ec)
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();

View File

@ -67,9 +67,37 @@ test02()
#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();
}