//===----------------------------------------------------------------------===//
//
// 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++98, c++03, c++11, c++14, c++17

// <compare>

// class strong_equality


#include <compare>
#include <type_traits>
#include <cassert>

#include "test_macros.h"

const volatile void* volatile sink;

void test_static_members() {
  DoNotOptimize(&std::strong_equality::equal);
  DoNotOptimize(&std::strong_equality::nonequal);
  DoNotOptimize(&std::strong_equality::equivalent);
  DoNotOptimize(&std::strong_equality::nonequivalent);
}

void test_signatures() {
  auto& Eq = std::strong_equality::equivalent;

  ASSERT_NOEXCEPT(Eq == 0);
  ASSERT_NOEXCEPT(0 == Eq);
  ASSERT_NOEXCEPT(Eq != 0);
  ASSERT_NOEXCEPT(0 != Eq);
#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR
  ASSERT_NOEXCEPT(0 <=> Eq);
  ASSERT_NOEXCEPT(Eq <=> 0);
  ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::strong_equality);
  ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::strong_equality);
#endif
}

void test_conversion() {
  constexpr std::weak_equality res = std::strong_equality::equivalent;
  static_assert(res == 0, "");
  static_assert(std::is_convertible<const std::strong_equality&,
      std::weak_equality>::value, "");
  static_assert(res == 0, "expected equal");

  constexpr std::weak_equality neq_res = std::strong_equality::nonequivalent;
  static_assert(neq_res != 0, "expected not equal");
}

constexpr bool test_constexpr() {
  auto& Eq = std::strong_equality::equal;
  auto& NEq = std::strong_equality::nonequal;
  auto& Equiv = std::strong_equality::equivalent;
  auto& NEquiv = std::strong_equality::nonequivalent;
  assert((Eq == 0) == true);
  assert((0 == Eq) == true);
  assert((Equiv == 0) == true);
  assert((0 == Equiv) == true);
  assert((NEq == 0) == false);
  assert((0 == NEq) == false);
  assert((NEquiv == 0) == false);
  assert((0 == NEquiv) == false);

  assert((Eq != 0) == false);
  assert((0 != Eq) == false);
  assert((Equiv != 0) == false);
  assert((0 != Equiv) == false);
  assert((NEq != 0) == true);
  assert((0 != NEq) == true);
  assert((NEquiv != 0) == true);
  assert((0 != NEquiv) == true);

#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR
  std::strong_equality res = (Eq <=> 0);
  ((void)res);
  res = (0 <=> Eq);
  ((void)res);
#endif

  return true;
}

int main(int, char**) {
  test_static_members();
  test_signatures();
  test_conversion();
  static_assert(test_constexpr(), "constexpr test failed");

  return 0;
}
