brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · cefea50 Raw
198 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <compare>12 13// class strong_ordering14 15 16#include <compare>17#include <type_traits>18#include <cassert>19 20#include "test_macros.h"21 22const volatile void* volatile sink;23 24void test_static_members() {25  DoNotOptimize(&std::strong_ordering::less);26  DoNotOptimize(&std::strong_ordering::equal);27  DoNotOptimize(&std::strong_ordering::equivalent);28  DoNotOptimize(&std::strong_ordering::greater);29}30 31void test_signatures() {32  auto& Eq = std::strong_ordering::equivalent;33 34  ASSERT_NOEXCEPT(Eq == 0);35  ASSERT_NOEXCEPT(0 == Eq);36  ASSERT_NOEXCEPT(Eq != 0);37  ASSERT_NOEXCEPT(0 != Eq);38  ASSERT_NOEXCEPT(0 < Eq);39  ASSERT_NOEXCEPT(Eq < 0);40  ASSERT_NOEXCEPT(0 <= Eq);41  ASSERT_NOEXCEPT(Eq <= 0);42  ASSERT_NOEXCEPT(0 > Eq);43  ASSERT_NOEXCEPT(Eq > 0);44  ASSERT_NOEXCEPT(0 >= Eq);45  ASSERT_NOEXCEPT(Eq >= 0);46  ASSERT_NOEXCEPT(0 <=> Eq);47  ASSERT_NOEXCEPT(Eq <=> 0);48  ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::strong_ordering);49  ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::strong_ordering);50}51 52constexpr void test_equality() {53  auto& StrongEq = std::strong_ordering::equal;54  auto& PartialEq = std::partial_ordering::equivalent;55  assert(StrongEq == PartialEq);56 57  auto& WeakEq = std::weak_ordering::equivalent;58  assert(StrongEq == WeakEq);59}60 61constexpr bool test_conversion() {62  static_assert(std::is_convertible<const std::strong_ordering&,63      std::partial_ordering>::value, "");64  { // value == 065    auto V = std::strong_ordering::equivalent;66    std::partial_ordering WV = V;67    assert(WV == 0);68  }69  { // value < 070    auto V = std::strong_ordering::less;71    std::partial_ordering WV = V;72    assert(WV < 0);73  }74  { // value > 075    auto V = std::strong_ordering::greater;76    std::partial_ordering WV = V;77    assert(WV > 0);78  }79 80  static_assert(std::is_convertible<const std::strong_ordering&,81      std::weak_ordering>::value, "");82  { // value == 083    auto V = std::strong_ordering::equivalent;84    std::weak_ordering WV = V;85    assert(WV == 0);86  }87  { // value < 088    auto V = std::strong_ordering::less;89    std::weak_ordering WV = V;90    assert(WV < 0);91  }92  { // value > 093    auto V = std::strong_ordering::greater;94    std::weak_ordering WV = V;95    assert(WV > 0);96  }97  return true;98}99 100constexpr bool test_constexpr() {101  auto& Eq = std::strong_ordering::equal;102  auto& Equiv = std::strong_ordering::equivalent;103  auto& Less = std::strong_ordering::less;104  auto& Greater = std::strong_ordering::greater;105  struct {106    std::strong_ordering Value;107    bool ExpectEq;108    bool ExpectNeq;109    bool ExpectLess;110    bool ExpectGreater;111  } TestCases[] = {112      {Eq, true, false, false, false},113      {Equiv, true, false, false, false},114      {Less, false, true, true, false},115      {Greater, false, true, false, true},116  };117  for (auto TC : TestCases) {118    auto V = TC.Value;119    assert((V == 0) == TC.ExpectEq);120    assert((0 == V) == TC.ExpectEq);121    assert((V != 0) == TC.ExpectNeq);122    assert((0 != V) == TC.ExpectNeq);123 124    assert((V < 0) == TC.ExpectLess);125    assert((V > 0) == TC.ExpectGreater);126    assert((V <= 0) == (TC.ExpectLess || TC.ExpectEq));127    assert((V >= 0) == (TC.ExpectGreater || TC.ExpectEq));128 129    assert((0 < V) == TC.ExpectGreater);130    assert((0 > V) == TC.ExpectLess);131    assert((0 <= V) == (TC.ExpectGreater || TC.ExpectEq));132    assert((0 >= V) == (TC.ExpectLess || TC.ExpectEq));133  }134  {135    std::strong_ordering res = (Eq <=> 0);136    ((void)res);137    res = (0 <=> Eq);138    ((void)res);139  }140  enum ExpectRes {141    ER_Greater,142    ER_Less,143    ER_Equiv144  };145  struct {146    std::strong_ordering Value;147    ExpectRes Expect;148  } SpaceshipTestCases[] = {149      {std::strong_ordering::equivalent, ER_Equiv},150      {std::strong_ordering::less, ER_Less},151      {std::strong_ordering::greater, ER_Greater},152  };153  for (auto TC : SpaceshipTestCases)154  {155    std::strong_ordering Res = (TC.Value <=> 0);156    switch (TC.Expect) {157    case ER_Equiv:158      assert(Res == 0);159      assert(0 == Res);160      break;161    case ER_Less:162      assert(Res < 0);163      break;164    case ER_Greater:165      assert(Res > 0);166      break;167    }168  }169  {170    static_assert(std::strong_ordering::less == std::strong_ordering::less);171    static_assert(std::strong_ordering::less != std::strong_ordering::equal);172    static_assert(std::strong_ordering::less != std::strong_ordering::greater);173 174    static_assert(std::strong_ordering::equal != std::strong_ordering::less);175    static_assert(std::strong_ordering::equal == std::strong_ordering::equal);176    static_assert(std::strong_ordering::equal != std::strong_ordering::greater);177 178    static_assert(std::strong_ordering::greater != std::strong_ordering::less);179    static_assert(std::strong_ordering::greater != std::strong_ordering::equal);180    static_assert(std::strong_ordering::greater ==181                  std::strong_ordering::greater);182  }183 184  test_equality();185 186  return true;187}188 189int main(int, char**) {190  test_static_members();191  test_signatures();192  test_equality();193  static_assert(test_conversion(), "conversion test failed");194  static_assert(test_constexpr(), "constexpr test failed");195 196  return 0;197}198