libstdc++: Swap expressions in noexcept-specifier of ranges::not_equal_to

Although this should never make a difference for sensible code, we
should really make the expression in the noexcept-specifier match the
expression in the function body.

libstdc++-v3/ChangeLog:

	* include/bits/ranges_cmp.h (not_equal_to): Make order of
	expressions in noexcept-specifier match the body.
	* testsuite/20_util/function_objects/range.cmp/not_equal_to.cc:
	Check noexcept.
This commit is contained in:
Jonathan Wakely 2024-12-12 23:24:39 +00:00 committed by Jonathan Wakely
parent ba1b6ed1c9
commit 233860f005
No known key found for this signature in database
2 changed files with 18 additions and 1 deletions

View file

@ -99,7 +99,7 @@ namespace ranges
requires equality_comparable_with<_Tp, _Up>
constexpr bool
operator()(_Tp&& __t, _Up&& __u) const
noexcept(noexcept(std::declval<_Up>() == std::declval<_Tp>()))
noexcept(noexcept(std::declval<_Tp>() == std::declval<_Up>()))
{ return !equal_to{}(std::forward<_Tp>(__t), std::forward<_Up>(__u)); }
using is_transparent = __is_transparent;

View file

@ -68,9 +68,26 @@ test02()
VERIFY( ! f(x, x) );
}
struct A
{
bool operator==(const A&) const noexcept { return true; }
bool operator==(A&&) const { return true; }
};
void
test03()
{
const A a{};
static_assert( noexcept(a == a) );
static_assert( ! noexcept(a == A{}) );
static_assert( noexcept(std::ranges::not_equal_to{}(a, a)) );
static_assert( ! noexcept(std::ranges::not_equal_to{}(a, A{})) );
}
int
main()
{
test01();
test02();
test03();
}