Fix undefined references in libstdc++fs.a
authorJonathan Wakely <jwakely@redhat.com>
Wed, 28 Nov 2018 17:07:22 +0000 (17:07 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 28 Nov 2018 17:07:22 +0000 (17:07 +0000)
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
libstdc++-v3/src/filesystem/path.cc

index 6d781b5593b5c70ab56c5bb3c3b787f29cf9b4ae..1107da0f53e85d7a289ecd68ca3518433ec0f286 100644 (file)
@@ -1,5 +1,9 @@
 2018-11-28  Jonathan Wakely  <jwakely@redhat.com>
 
+       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.
index fb70d30fdca28a50f6707aa335aa32232f0619f8..63da684cf0a8032ad55d4a25d509807905a7e479 100644 (file)
@@ -485,28 +485,32 @@ fs::hash_value(const path& p) noexcept
   return seed;
 }
 
-namespace std
-{
-_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
+#include <experimental/string_view>
 
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace std
+std::string
+fs::filesystem_error::_M_gen_what()
+{
+  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;
+}