From: Jonathan Wakely Date: Wed, 24 Apr 2019 21:35:26 +0000 (+0100) Subject: Make filesystem::path comparison operators hidden friends (LWG 3065) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f90b16c429fec60a1aaa10c6ef26a7a536b61e2a;p=gcc.git Make filesystem::path comparison operators hidden friends (LWG 3065) 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 33b6371bd0d..abd3b526d2b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2019-04-24 Jonathan Wakely + * 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. diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h index bf7c65c9cad..3674b4391f8 100644 --- a/libstdc++-v3/include/bits/fs_path.h +++ b/libstdc++-v3/include/bits/fs_path.h @@ -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, @@ -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 inline auto u8path(_InputIterator __first, _InputIterator __last) diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/native/string-char8_t.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/native/string-char8_t.cc index 4f187da7804..f5bb1afca5d 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/path/native/string-char8_t.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/native/string-char8_t.cc @@ -46,7 +46,7 @@ test02() path p(s); auto str = p.string(); - VERIFY( str == u"abc" ); + VERIFY( str == "abc" ); VERIFY( str == p.string() ); auto strw = p.string(); diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/native/string.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/native/string.cc index 5417ab4c011..4d45c7e15df 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/path/native/string.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/native/string.cc @@ -46,7 +46,7 @@ test02() path p(s); auto str = p.string(); - VERIFY( str == u"abc" ); + VERIFY( str == "abc" ); VERIFY( str == p.string() ); auto strw = p.string();