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.
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;
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();
}