PR libstdc++/91786
        * include/bits/fs_path.h (filesystem_error): Move definition before
        the use in u8path.

Tested powerpc64le-linux, committed to trunk.


commit 48db2e15557a1e7bff8ce629c8e9979d0b6d0c29
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri Nov 22 00:29:05 2019 +0000

    PR libstdc++/91786 fix compilation error with Clang
    
            PR libstdc++/91786
            * include/bits/fs_path.h (filesystem_error): Move definition before
            the use in u8path.

diff --git a/libstdc++-v3/include/bits/fs_path.h 
b/libstdc++-v3/include/bits/fs_path.h
index e1083acf30f..031ec3d7c7f 100644
--- a/libstdc++-v3/include/bits/fs_path.h
+++ b/libstdc++-v3/include/bits/fs_path.h
@@ -622,59 +622,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
 
   size_t hash_value(const path& __p) noexcept;
 
-  /// Create a path from a UTF-8-encoded sequence of char
-  template<typename _InputIterator>
-    inline auto
-    u8path(_InputIterator __first, _InputIterator __last)
-    -> decltype(filesystem::path(__first, __last, std::locale::classic()))
-    {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      // XXX This assumes native wide encoding is UTF-16.
-      std::codecvt_utf8_utf16<path::value_type> __cvt;
-      path::string_type __tmp;
-      if constexpr (is_pointer_v<_InputIterator>)
-       {
-         if (__str_codecvt_in_all(__first, __last, __tmp, __cvt))
-           return path{ __tmp };
-       }
-      else
-       {
-         const std::string __u8str{__first, __last};
-         const char* const __ptr = __u8str.data();
-         if (__str_codecvt_in_all(__ptr, __ptr + __u8str.size(), __tmp, __cvt))
-           return path{ __tmp };
-       }
-      _GLIBCXX_THROW_OR_ABORT(filesystem_error(
-           "Cannot convert character sequence",
-           std::make_error_code(errc::illegal_byte_sequence)));
-#else
-      // This assumes native normal encoding is UTF-8.
-      return path{ __first, __last };
-#endif
-    }
-
-  /// Create a path from a UTF-8-encoded sequence of char
-  template<typename _Source>
-    inline auto
-    u8path(const _Source& __source)
-    -> decltype(filesystem::path(__source, std::locale::classic()))
-    {
-#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
-      if constexpr (is_convertible_v<const _Source&, std::string_view>)
-       {
-         const std::string_view __s = __source;
-         return filesystem::u8path(__s.data(), __s.data() + __s.size());
-       }
-      else
-       {
-         std::string __s = path::_S_string_from_iter(__source);
-         return filesystem::u8path(__s.data(), __s.data() + __s.size());
-       }
-#else
-      return path{ __source };
-#endif
-    }
-
   /// @}
 
   /// Exception type thrown by the Filesystem library
@@ -706,6 +653,65 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
     std::__shared_ptr<const _Impl> _M_impl;
   };
 
+  /** Create a path from a UTF-8-encoded sequence of char
+   *
+   * @relates std::filesystem::path
+   */
+  template<typename _InputIterator>
+    inline auto
+    u8path(_InputIterator __first, _InputIterator __last)
+    -> decltype(filesystem::path(__first, __last, std::locale::classic()))
+    {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      // XXX This assumes native wide encoding is UTF-16.
+      std::codecvt_utf8_utf16<path::value_type> __cvt;
+      path::string_type __tmp;
+      if constexpr (is_pointer_v<_InputIterator>)
+       {
+         if (__str_codecvt_in_all(__first, __last, __tmp, __cvt))
+           return path{ __tmp };
+       }
+      else
+       {
+         const std::string __u8str{__first, __last};
+         const char* const __ptr = __u8str.data();
+         if (__str_codecvt_in_all(__ptr, __ptr + __u8str.size(), __tmp, __cvt))
+           return path{ __tmp };
+       }
+      _GLIBCXX_THROW_OR_ABORT(filesystem_error(
+           "Cannot convert character sequence",
+           std::make_error_code(errc::illegal_byte_sequence)));
+#else
+      // This assumes native normal encoding is UTF-8.
+      return path{ __first, __last };
+#endif
+    }
+
+  /** Create a path from a UTF-8-encoded sequence of char
+   *
+   * @relates std::filesystem::path
+   */
+  template<typename _Source>
+    inline auto
+    u8path(const _Source& __source)
+    -> decltype(filesystem::path(__source, std::locale::classic()))
+    {
+#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
+      if constexpr (is_convertible_v<const _Source&, std::string_view>)
+       {
+         const std::string_view __s = __source;
+         return filesystem::u8path(__s.data(), __s.data() + __s.size());
+       }
+      else
+       {
+         std::string __s = path::_S_string_from_iter(__source);
+         return filesystem::u8path(__s.data(), __s.data() + __s.size());
+       }
+#else
+      return path{ __source };
+#endif
+    }
+
   /// @cond undocumented
 
   struct path::_Cmpt : path

Reply via email to