Make filesystem::path comparison operators hidden friends (LWG 3065)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 24 Apr 2019 21:35:26 +0000 (22:35 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 24 Apr 2019 21:35:26 +0000 (22:35 +0100)
This change revealed two testsuite bugs where some string comparisons
only compiled by converting the strings to filesystem::path objects.

* include/bits/fs_path.h (operator<, operator<=, operator>)
(operator>=, operator==, operator!=): Make hidden friends, as per
LWG 3065.
* testsuite/27_io/filesystem/path/native/string-char8_t.cc: Fix
string type in test.
* testsuite/27_io/filesystem/path/native/string.cc: Likewise.

From-SVN: r270558

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/fs_path.h
libstdc++-v3/testsuite/27_io/filesystem/path/native/string-char8_t.cc
libstdc++-v3/testsuite/27_io/filesystem/path/native/string.cc

index 33b6371bd0d2b60fe299204e98bba4e9953c4454..abd3b526d2b40485a04b40511a078b38a5931a99 100644 (file)
@@ -1,5 +1,12 @@
 2019-04-24  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/bits/fs_path.h (operator<, operator<=, operator>)
+       (operator>=, operator==, operator!=): Make hidden friends, as per
+       LWG 3065.
+       * testsuite/27_io/filesystem/path/native/string-char8_t.cc: Fix
+       string type in test.
+       * testsuite/27_io/filesystem/path/native/string.cc: Likewise.
+
        * include/std/any (any::any(ValueType&&)): Use __and_v.
        * include/std/numeric (midpoint(T, T, T), midpoint(T*, T*, T*)):
        Likewise.
index bf7c65c9cad24bb1e830dc79cc2fb1ef13a4d15e..3674b4391f808a6888ece5145f4a5b9a1617b381 100644 (file)
@@ -417,6 +417,40 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        return __is;
       }
 
+    // non-member operators
+
+    /// Compare paths
+    friend bool operator<(const path& __lhs, const path& __rhs) noexcept
+    { return __lhs.compare(__rhs) < 0; }
+
+    /// Compare paths
+    friend bool operator<=(const path& __lhs, const path& __rhs) noexcept
+    { return !(__rhs < __lhs); }
+
+    /// Compare paths
+    friend bool operator>(const path& __lhs, const path& __rhs) noexcept
+    { return __rhs < __lhs; }
+
+    /// Compare paths
+    friend bool operator>=(const path& __lhs, const path& __rhs) noexcept
+    { return !(__lhs < __rhs); }
+
+    /// Compare paths
+    friend bool operator==(const path& __lhs, const path& __rhs) noexcept
+    { return __lhs.compare(__rhs) == 0; }
+
+    /// Compare paths
+    friend bool operator!=(const path& __lhs, const path& __rhs) noexcept
+    { return !(__lhs == __rhs); }
+
+    /// Append one path to another
+    friend path operator/(const path& __lhs, const path& __rhs)
+    {
+      path __result(__lhs);
+      __result /= __rhs;
+      return __result;
+    }
+
     // Create a basic_string by reading until a null character.
     template<typename _InputIterator,
             typename _Traits = std::iterator_traits<_InputIterator>,
@@ -578,38 +612,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
 
   size_t hash_value(const path& __p) noexcept;
 
-  /// Compare paths
-  inline bool operator<(const path& __lhs, const path& __rhs) noexcept
-  { return __lhs.compare(__rhs) < 0; }
-
-  /// Compare paths
-  inline bool operator<=(const path& __lhs, const path& __rhs) noexcept
-  { return !(__rhs < __lhs); }
-
-  /// Compare paths
-  inline bool operator>(const path& __lhs, const path& __rhs) noexcept
-  { return __rhs < __lhs; }
-
-  /// Compare paths
-  inline bool operator>=(const path& __lhs, const path& __rhs) noexcept
-  { return !(__lhs < __rhs); }
-
-  /// Compare paths
-  inline bool operator==(const path& __lhs, const path& __rhs) noexcept
-  { return __lhs.compare(__rhs) == 0; }
-
-  /// Compare paths
-  inline bool operator!=(const path& __lhs, const path& __rhs) noexcept
-  { return !(__lhs == __rhs); }
-
-  /// Append one path to another
-  inline path operator/(const path& __lhs, const path& __rhs)
-  {
-    path __result(__lhs);
-    __result /= __rhs;
-    return __result;
-  }
-
   template<typename _InputIterator>
     inline auto
     u8path(_InputIterator __first, _InputIterator __last)
index 4f187da7804fa0edba6a73d7b6c13731d543f911..f5bb1afca5d9a17dd2feb18e84df3750a5f04798 100644 (file)
@@ -46,7 +46,7 @@ test02()
   path p(s);
 
   auto str = p.string<char>();
-  VERIFY( str == u"abc" );
+  VERIFY( str == "abc" );
   VERIFY( str == p.string() );
 
   auto strw = p.string<wchar_t>();
index 5417ab4c011f8ee9aa38bd5d394299a079d43082..4d45c7e15dff89e34225278a7f54f61e35461aa2 100644 (file)
@@ -46,7 +46,7 @@ test02()
   path p(s);
 
   auto str = p.string<char>();
-  VERIFY( str == u"abc" );
+  VERIFY( str == "abc" );
   VERIFY( str == p.string() );
 
   auto strw = p.string<wchar_t>();