From 345d2d034989be69e97c45e7fcea8fe4c2409a6f Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 28 Nov 2018 17:07:22 +0000 Subject: [PATCH] Fix undefined references in libstdc++fs.a The recent patch for PR 83306 removed the fs_err_concat functions that were used by the experimental::filesystem::filesystem_error class as well. This fixes it by doing the string generation directly in filesystem_error::_M_gen_what() instead of using the removed function. PR libstdc++/83306 * src/filesystem/path.cc (filesystem_error::_M_gen_what()): Create string directly, instead of calling fs_err_concat. From-SVN: r266569 --- libstdc++-v3/ChangeLog | 4 +++ libstdc++-v3/src/filesystem/path.cc | 52 ++++++++++++++++------------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6d781b5593b..1107da0f53e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2018-11-28 Jonathan Wakely + PR libstdc++/83306 + * src/filesystem/path.cc (filesystem_error::_M_gen_what()): Create + string directly, instead of calling fs_err_concat. + PR libstdc++/83511 * include/std/string_view (basic_string_view::substr): Add default argument to first parameter. diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc index fb70d30fdca..63da684cf0a 100644 --- a/libstdc++-v3/src/filesystem/path.cc +++ b/libstdc++-v3/src/filesystem/path.cc @@ -485,28 +485,32 @@ fs::hash_value(const path& p) noexcept return seed; } -namespace std +#include + +std::string +fs::filesystem_error::_M_gen_what() { -_GLIBCXX_BEGIN_NAMESPACE_VERSION -namespace filesystem -{ - extern string - fs_err_concat(const string& __what, const string& __path1, - const string& __path2); -} // namespace filesystem - -namespace experimental::filesystem::v1 { -_GLIBCXX_BEGIN_NAMESPACE_CXX11 - - std::string filesystem_error::_M_gen_what() - { - using std::filesystem::fs_err_concat; - return fs_err_concat(system_error::what(), _M_path1.u8string(), - _M_path2.u8string()); - } - -_GLIBCXX_END_NAMESPACE_CXX11 -} // namespace experimental::filesystem::v1 - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace std + const std::string pstr1 = _M_path1.u8string(); + const std::string pstr2 = _M_path2.u8string(); + experimental::string_view s = this->system_error::what(); + const size_t len = 18 + s.length() + + (pstr1.length() ? pstr1.length() + 3 : 0) + + (pstr2.length() ? pstr2.length() + 3 : 0); + std::string w; + w.reserve(len); + w = "filesystem error: "; + w.append(s.data(), s.length()); + if (!pstr1.empty()) + { + w += " ["; + w += pstr1; + w += ']'; + } + if (!pstr1.empty()) + { + w += " ["; + w += pstr2; + w += ']'; + } + return w; +}