libstdc++: Fix inefficiency in filesystem::absolute [PR99876]

When the path is already absolute, the call to current_path() is
wasteful, because operator/ will ignore the left operand anyway.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/99876
	* src/c++17/fs_ops.cc (fs::absolute): Call non-throwing form,
	to avoid unnecessary current_path() call.
This commit is contained in:
Jonathan Wakely 2021-08-27 10:59:54 +01:00
parent 952095bb05
commit 07b990ee23

View File

@ -65,19 +65,12 @@ namespace posix = std::filesystem::__gnu_posix;
fs::path fs::path
fs::absolute(const path& p) fs::absolute(const path& p)
{ {
#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
error_code ec; error_code ec;
path ret = absolute(p, ec); path ret = absolute(p, ec);
if (ec) if (ec)
_GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot make absolute path", p, _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot make absolute path", p,
ec)); ec));
return ret; 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
} }
fs::path fs::path