diff --git a/libstdc++-v3/include/bits/ranges_cmp.h b/libstdc++-v3/include/bits/ranges_cmp.h index 8425016288c..b1a33f48d02 100644 --- a/libstdc++-v3/include/bits/ranges_cmp.h +++ b/libstdc++-v3/include/bits/ranges_cmp.h @@ -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; diff --git a/libstdc++-v3/testsuite/20_util/function_objects/range.cmp/not_equal_to.cc b/libstdc++-v3/testsuite/20_util/function_objects/range.cmp/not_equal_to.cc index 5b4f3cb32ff..1b5167f9783 100644 --- a/libstdc++-v3/testsuite/20_util/function_objects/range.cmp/not_equal_to.cc +++ b/libstdc++-v3/testsuite/20_util/function_objects/range.cmp/not_equal_to.cc @@ -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(); }