--- /dev/null
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-no-concepts
+
+// template<class T, class U>
+// concept equality_comparable_with = // see below
+
+#include <concepts>
+
+#include <array>
+#include <deque>
+#include <forward_list>
+#include <list>
+#include <map>
+#include <memory>
+#include <mutex>
+#include <optional>
+#include <set>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
+
+#include "../types.h"
+
+template <class T, class U>
+constexpr bool check_equality_comparable_with() {
+ constexpr bool result = std::equality_comparable_with<T, U>;
+ static_assert(std::equality_comparable_with<U, T> == result);
+ static_assert(std::equality_comparable_with<T, U const> == result);
+ static_assert(std::equality_comparable_with<T const, U const> == result);
+ static_assert(std::equality_comparable_with<T, U const&> == result);
+ static_assert(std::equality_comparable_with<T const, U const&> == result);
+ static_assert(std::equality_comparable_with<T&, U const> == result);
+ static_assert(std::equality_comparable_with<T const&, U const> == result);
+ static_assert(std::equality_comparable_with<T&, U const&> == result);
+ static_assert(std::equality_comparable_with<T const&, U const&> == result);
+ static_assert(std::equality_comparable_with<T, U const&&> == result);
+ static_assert(std::equality_comparable_with<T const, U const&&> == result);
+ static_assert(std::equality_comparable_with<T&, U const&&> == result);
+ static_assert(std::equality_comparable_with<T const&, U const&&> == result);
+ static_assert(std::equality_comparable_with<T&&, U const> == result);
+ static_assert(std::equality_comparable_with<T const&&, U const> == result);
+ static_assert(std::equality_comparable_with<T&&, U const&> == result);
+ static_assert(std::equality_comparable_with<T const&&, U const&> == result);
+ static_assert(std::equality_comparable_with<T&&, U const&&> == result);
+ static_assert(std::equality_comparable_with<T const&&, U const&&> == result);
+ return result;
+}
+
+namespace fundamentals {
+static_assert(check_equality_comparable_with<int, int>());
+static_assert(check_equality_comparable_with<int, bool>());
+static_assert(check_equality_comparable_with<int, char>());
+static_assert(check_equality_comparable_with<int, wchar_t>());
+static_assert(check_equality_comparable_with<int, double>());
+static_assert(!check_equality_comparable_with<int, int*>());
+static_assert(!check_equality_comparable_with<int, int[5]>());
+static_assert(!check_equality_comparable_with<int, int (*)()>());
+static_assert(!check_equality_comparable_with<int, int (&)()>());
+
+struct S {};
+static_assert(!check_equality_comparable_with<int, int S::*>());
+static_assert(!check_equality_comparable_with<int, int (S::*)()>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() noexcept>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() const>());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() const noexcept>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() volatile>());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int, int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() const&>());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() volatile&>());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() const volatile &
+ noexcept>());
+static_assert(!check_equality_comparable_with<int, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int, int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int, int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int, int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int*, int*>());
+static_assert(check_equality_comparable_with<int*, int[5]>());
+static_assert(!check_equality_comparable_with<int*, int (*)()>());
+static_assert(!check_equality_comparable_with<int*, int (&)()>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)()>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() noexcept>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() const>());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() const noexcept>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() volatile>());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int*, int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() const&>());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() volatile&>());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int*, int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int*,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int*,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int*, int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int*,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int*, int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int*,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int[5], int[5]>());
+static_assert(!check_equality_comparable_with<int[5], int (*)()>());
+static_assert(!check_equality_comparable_with<int[5], int (&)()>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)()>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() noexcept>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() const>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() const noexcept>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() volatile>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int[5], int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() &>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() const&>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() const & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() volatile &
+ noexcept>());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int[5], int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int[5],
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int[5], int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int[5],
+ int (S::*)() const&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int[5],
+ int (S::*)() volatile&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int[5], int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int[5],
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (*)(), int (*)()>());
+static_assert(check_equality_comparable_with<int (*)(), int (&)()>());
+static_assert(!check_equality_comparable_with<int (*)(), int (S::*)()>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() noexcept>());
+static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() const>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() const noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() volatile>());
+static_assert(!check_equality_comparable_with<
+ int (*)(), int (S::*)() volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int (*)(), int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() &>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (*)(),
+ int (S::*)() const & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() volatile &
+ noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (*)(), int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (*)(), int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (*)(),
+ int (S::*)() && noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (*)(),
+ int (S::*)() const&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (*)(), int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (*)(),
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (*)(),
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (*)(),
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (&)(), int (&)()>());
+static_assert(!check_equality_comparable_with<int (&)(), int (S::*)()>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() noexcept>());
+static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() const>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() const noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() volatile>());
+static_assert(!check_equality_comparable_with<
+ int (&)(), int (S::*)() volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int (&)(), int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() &>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (&)(),
+ int (S::*)() const & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() volatile &
+ noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (&)(), int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (&)(), int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (&)(),
+ int (S::*)() && noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (&)(),
+ int (S::*)() const&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (&)(), int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (&)(),
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (&)(),
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (&)(),
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)(), int (S::*)()>());
+static_assert(
+ check_equality_comparable_with<int (S::*)(), int (S::*)() noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() const>());
+static_assert(!check_equality_comparable_with<int (S::*)(),
+ int (S::*)() const noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)(), int (S::*)() volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)(),
+ int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)(), int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)(), int (S::*)() &>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)(),
+ int (S::*)() const & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)(), int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)(),
+ int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)(), int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)(), int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)(),
+ int (S::*)() && noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)(),
+ int (S::*)() const&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)(), int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)(),
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)(),
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)(),
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() noexcept, int (S::*)() volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() noexcept, int (S::*)() const volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() noexcept, int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() noexcept, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() noexcept, int (S::*)() const volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() noexcept, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() const, int (S::*)() const>());
+static_assert(check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() const noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const, int (S::*)() volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const, int (S::*)() const volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const, int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const, int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const, int (S::*)() const volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const noexcept, int (S::*)() volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const volatile>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const noexcept, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() volatile>());
+static_assert(check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() const volatile>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() volatile, int (S::*)() const volatile noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile, int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() volatile, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() volatile, int (S::*)() const volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const volatile>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const volatile>());
+static_assert(
+ check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() &>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() const volatile noexcept,
+ int (S::*)() const volatile noexcept>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() &>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() const&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile noexcept,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile noexcept,
+ int (S::*)() volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile noexcept,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile noexcept, int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() &, int (S::*)() &>());
+static_assert(
+ check_equality_comparable_with<int (S::*)() &, int (S::*)() & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() &, int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() &,
+ int (S::*)() const & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() &, int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() &, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() &,
+ int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() &, int (S::*)() const volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() &, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &,
+ int (S::*)() && noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() &, int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &,
+ int (S::*)() const&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() &, int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() &,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() const&>());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() & noexcept, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() & noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() & noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() const&, int (S::*)() const&>());
+static_assert(check_equality_comparable_with<int (S::*)() const&,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const&,
+ int (S::*)() volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const&, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const&,
+ int (S::*)() const volatile&>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const&, int (S::*)() const volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const&, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const&,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const&,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const&,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() const & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const & noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const& noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() volatile&,
+ int (S::*)() volatile&>());
+static_assert(check_equality_comparable_with<
+ int (S::*)() volatile&, int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile&,
+ int (S::*)() const volatile & noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile&, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile&,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile&,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() const volatile&>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile & noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile& noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const volatile&,
+ int (S::*)() const volatile&>());
+static_assert(
+ check_equality_comparable_with<int (S::*)() const volatile&,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
+ int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
+ int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const volatile&,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const volatile&,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() const volatile & noexcept,
+ int (S::*)() const volatile & noexcept>());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile & noexcept, int (S::*)() &&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile& noexcept,
+ int (S::*)() && noexcept > ());
+static_assert(!check_equality_comparable_with<
+ int (S::*)() const volatile & noexcept, int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile& noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile & noexcept,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile& noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() const volatile & noexcept,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)()
+ const volatile& noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() &&, int (S::*)() &&>());
+static_assert(check_equality_comparable_with<int (S::*)() &&,
+ int (S::*)() && noexcept>());
+static_assert(
+ !check_equality_comparable_with<int (S::*)() &&, int (S::*)() const&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &&,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() &&,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &&,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() &&,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() &&,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() && noexcept,
+ int (S::*)() && noexcept>());
+static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
+ int (S::*)() const&& > ());
+static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
+ int (S::*)() const&& noexcept > ());
+static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
+ int (S::*)() volatile&& > ());
+static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
+ int (S::*)() const volatile&& > ());
+static_assert(!check_equality_comparable_with < int (S::*)() && noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const&&,
+ int (S::*)() const&&>());
+static_assert(check_equality_comparable_with<int (S::*)() const&&,
+ int (S::*)() const && noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() const&&,
+ int (S::*)() volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&&,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with<int (S::*)() const&&,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&&,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const && noexcept,
+ int (S::*)() const && noexcept>());
+static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
+ int (S::*)() volatile&& > ());
+static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
+ int (S::*)() volatile&& noexcept > ());
+static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
+ int (S::*)() const volatile&& > ());
+static_assert(!check_equality_comparable_with < int (S::*)() const&& noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() volatile&&,
+ int (S::*)() volatile&&>());
+static_assert(check_equality_comparable_with<
+ int (S::*)() volatile&&, int (S::*)() volatile && noexcept>());
+static_assert(!check_equality_comparable_with<int (S::*)() volatile&&,
+ int (S::*)() const volatile&&>());
+static_assert(!check_equality_comparable_with < int (S::*)() volatile&&,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(
+ check_equality_comparable_with<int (S::*)() volatile && noexcept,
+ int (S::*)() volatile && noexcept>());
+static_assert(!check_equality_comparable_with <
+ int (S::*)() volatile&& noexcept,
+ int (S::*)() const volatile&& > ());
+static_assert(!check_equality_comparable_with <
+ int (S::*)() volatile&& noexcept,
+ int (S::*)() const volatile&& noexcept > ());
+
+static_assert(check_equality_comparable_with<int (S::*)() const volatile&&,
+ int (S::*)() const volatile&&>());
+static_assert(
+ check_equality_comparable_with<int (S::*)() const volatile&&,
+ int (S::*)() const volatile && noexcept>());
+static_assert(
+ check_equality_comparable_with<int (S::*)() const volatile && noexcept,
+ int (S::*)() const volatile && noexcept>());
+
+static_assert(!check_equality_comparable_with<std::nullptr_t, int>());
+static_assert(check_equality_comparable_with<std::nullptr_t, int*>());
+static_assert(check_equality_comparable_with<std::nullptr_t, int[5]>());
+static_assert(check_equality_comparable_with<std::nullptr_t, int (*)()>());
+static_assert(check_equality_comparable_with<std::nullptr_t, int (&)()>());
+static_assert(check_equality_comparable_with<std::nullptr_t, int (S::*)()>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() const>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() const noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() volatile>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() volatile noexcept>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() const volatile>());
+static_assert(check_equality_comparable_with<
+ std::nullptr_t, int (S::*)() const volatile noexcept>());
+static_assert(check_equality_comparable_with<std::nullptr_t, int (S::*)() &>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() & noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() const&>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() const & noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() volatile&>());
+static_assert(check_equality_comparable_with<
+ std::nullptr_t, int (S::*)() volatile & noexcept>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() const volatile&>());
+static_assert(check_equality_comparable_with<
+ std::nullptr_t, int (S::*)() const volatile & noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() &&>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() && noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() const&&>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() const && noexcept>());
+static_assert(
+ check_equality_comparable_with<std::nullptr_t, int (S::*)() volatile&&>());
+static_assert(check_equality_comparable_with<
+ std::nullptr_t, int (S::*)() volatile && noexcept>());
+static_assert(check_equality_comparable_with<std::nullptr_t,
+ int (S::*)() const volatile&&>());
+static_assert(check_equality_comparable_with<
+ std::nullptr_t, int (S::*)() const volatile && noexcept>());
+
+static_assert(!std::equality_comparable_with<void, int>);
+static_assert(!std::equality_comparable_with<void, int*>);
+static_assert(!std::equality_comparable_with<void, std::nullptr_t>);
+static_assert(!std::equality_comparable_with<void, int[5]>);
+static_assert(!std::equality_comparable_with<void, int (*)()>);
+static_assert(!std::equality_comparable_with<void, int (&)()>);
+static_assert(!std::equality_comparable_with<void, int S::*>);
+static_assert(!std::equality_comparable_with<void, int (S::*)()>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() noexcept>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() const>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() const noexcept>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() volatile>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() volatile noexcept>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() const volatile>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() const volatile noexcept>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() &>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() & noexcept>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() const&>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() const & noexcept>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() volatile&>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() volatile & noexcept>);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() const volatile&>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() const volatile &
+ noexcept>);
+static_assert(!std::equality_comparable_with<void, int (S::*)() &&>);
+static_assert(!std::equality_comparable_with < void,
+ int (S::*)() && noexcept >);
+static_assert(!std::equality_comparable_with<void, int (S::*)() const&&>);
+static_assert(!std::equality_comparable_with < void,
+ int (S::*)() const&& noexcept >);
+static_assert(!std::equality_comparable_with<void, int (S::*)() volatile&&>);
+static_assert(!std::equality_comparable_with < void,
+ int (S::*)() volatile&& noexcept >);
+static_assert(
+ !std::equality_comparable_with<void, int (S::*)() const volatile&&>);
+static_assert(!std::equality_comparable_with < void,
+ int (S::*)() const volatile&& noexcept >);
+} // namespace fundamentals
+
+namespace standard_types {
+static_assert(check_equality_comparable_with<std::array<int, 10>,
+ std::array<int, 10> >());
+static_assert(!check_equality_comparable_with<std::array<int, 10>,
+ std::array<double, 10> >());
+static_assert(
+ check_equality_comparable_with<std::deque<int>, std::deque<int> >());
+static_assert(
+ !check_equality_comparable_with<std::deque<int>, std::vector<int> >());
+static_assert(check_equality_comparable_with<std::forward_list<int>,
+ std::forward_list<int> >());
+static_assert(!check_equality_comparable_with<std::forward_list<int>,
+ std::vector<int> >());
+static_assert(
+ check_equality_comparable_with<std::list<int>, std::list<int> >());
+static_assert(
+ !check_equality_comparable_with<std::list<int>, std::vector<int> >());
+
+#ifndef _LIBCPP_HAS_NO_THREADS
+static_assert(!check_equality_comparable_with<std::lock_guard<std::mutex>,
+ std::lock_guard<std::mutex> >());
+static_assert(!check_equality_comparable_with<std::lock_guard<std::mutex>,
+ std::vector<int> >());
+static_assert(!check_equality_comparable_with<std::mutex, std::mutex>());
+static_assert(!check_equality_comparable_with<std::mutex, std::vector<int> >());
+#endif
+
+static_assert(check_equality_comparable_with<std::map<int, void*>,
+ std::map<int, void*> >());
+static_assert(
+ !check_equality_comparable_with<std::map<int, void*>, std::vector<int> >());
+static_assert(
+ check_equality_comparable_with<std::optional<std::vector<int> >,
+ std::optional<std::vector<int> > >());
+static_assert(check_equality_comparable_with<std::optional<std::vector<int> >,
+ std::vector<int> >());
+static_assert(
+ check_equality_comparable_with<std::vector<int>, std::vector<int> >());
+static_assert(!check_equality_comparable_with<std::vector<int>, int>());
+} // namespace standard_types
+
+namespace types_fit_for_purpose {
+static_assert(
+ check_equality_comparable_with<cxx20_member_eq, cxx20_member_eq>());
+static_assert(
+ check_equality_comparable_with<cxx20_friend_eq, cxx20_friend_eq>());
+static_assert(
+ !check_equality_comparable_with<cxx20_member_eq, cxx20_friend_eq>());
+
+static_assert(check_equality_comparable_with<member_three_way_comparable,
+ member_three_way_comparable>());
+static_assert(check_equality_comparable_with<friend_three_way_comparable,
+ friend_three_way_comparable>());
+static_assert(!check_equality_comparable_with<member_three_way_comparable,
+ friend_three_way_comparable>());
+
+static_assert(
+ check_equality_comparable_with<explicit_operators, explicit_operators>());
+static_assert(check_equality_comparable_with<equality_comparable_with_ec1,
+ equality_comparable_with_ec1>());
+static_assert(check_equality_comparable_with<eq_neq_different_return_types,
+ eq_neq_different_return_types>());
+static_assert(check_equality_comparable_with<explicit_operators,
+ equality_comparable_with_ec1>());
+static_assert(check_equality_comparable_with<explicit_operators,
+ eq_neq_different_return_types>());
+
+static_assert(check_equality_comparable_with<one_way_eq, one_way_eq>());
+static_assert(
+ std::common_reference_with<one_way_eq const&, explicit_operators const&>);
+static_assert(
+ !check_equality_comparable_with<one_way_eq, explicit_operators>());
+
+static_assert(check_equality_comparable_with<one_way_ne, one_way_ne>());
+static_assert(
+ std::common_reference_with<one_way_ne const&, explicit_operators const&>);
+static_assert(
+ !check_equality_comparable_with<one_way_ne, explicit_operators>());
+} // namespace types_fit_for_purpose
+
+int main(int, char**) { return 0; }