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
This commit is contained in:
Jonathan Wakely 2019-04-24 22:35:26 +01:00 committed by Jonathan Wakely
parent 7f8aaa1ae9
commit f90b16c429
4 changed files with 43 additions and 34 deletions

View 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.

View 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)

View 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>();

View 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>();