brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 7d0ddb3 Raw
189 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 partial_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::partial_ordering::less);26  DoNotOptimize(&std::partial_ordering::equivalent);27  DoNotOptimize(&std::partial_ordering::greater);28  DoNotOptimize(&std::partial_ordering::unordered);29}30 31void test_signatures() {32  auto& Eq = std::partial_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::partial_ordering);49  ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::partial_ordering);50}51 52constexpr void test_equality() {53  auto& PartialEq = std::partial_ordering::equivalent;54  auto& WeakEq = std::weak_ordering::equivalent;55  assert(PartialEq == WeakEq);56 57  auto& StrongEq = std::strong_ordering::equal;58  assert(PartialEq == StrongEq);59}60 61constexpr bool test_constexpr() {62  auto& Eq = std::partial_ordering::equivalent;63  auto& Less = std::partial_ordering::less;64  auto& Greater = std::partial_ordering::greater;65  auto& Unord = std::partial_ordering::unordered;66  struct {67    std::partial_ordering Value;68    bool ExpectEq;69    bool ExpectNeq;70    bool ExpectLess;71    bool ExpectGreater;72  } TestCases[] = {73      {Eq, true, false, false, false},74      {Less, false, true, true, false},75      {Greater, false, true, false, true},76      {Unord, false, true, false, false}77  };78  for (auto TC : TestCases) {79    auto V = TC.Value;80    assert((V == 0) == TC.ExpectEq);81    assert((0 == V) == TC.ExpectEq);82    assert((V != 0) == TC.ExpectNeq);83    assert((0 != V) == TC.ExpectNeq);84 85    assert((V < 0) == TC.ExpectLess);86    assert((V > 0) == TC.ExpectGreater);87    assert((V <= 0) == (TC.ExpectLess || TC.ExpectEq));88    assert((V >= 0) == (TC.ExpectGreater || TC.ExpectEq));89 90    assert((0 < V) == TC.ExpectGreater);91    assert((0 > V) == TC.ExpectLess);92    assert((0 <= V) == (TC.ExpectGreater || TC.ExpectEq));93    assert((0 >= V) == (TC.ExpectLess || TC.ExpectEq));94  }95  {96    std::partial_ordering res = (Eq <=> 0);97    ((void)res);98    res = (0 <=> Eq);99    ((void)res);100  }101  enum ExpectRes {102    ER_Greater,103    ER_Less,104    ER_Equiv,105    ER_Unord106  };107  struct {108    std::partial_ordering Value;109    ExpectRes Expect;110  } SpaceshipTestCases[] = {111      {std::partial_ordering::equivalent, ER_Equiv},112      {std::partial_ordering::less, ER_Less},113      {std::partial_ordering::greater, ER_Greater},114      {std::partial_ordering::unordered, ER_Unord}115  };116  for (auto TC : SpaceshipTestCases)117  {118    std::partial_ordering Res = (TC.Value <=> 0);119    switch (TC.Expect) {120    case ER_Equiv:121      assert(Res == 0);122      assert(0 == Res);123      break;124    case ER_Less:125      assert(Res < 0);126      break;127    case ER_Greater:128      assert(Res > 0);129      break;130    case ER_Unord:131      assert(Res != 0);132      assert(0 != Res);133      assert((Res < 0) == false);134      assert((Res > 0) == false);135      assert((Res == 0) == false);136      break;137    }138  }139  {140    static_assert(std::partial_ordering::less == std::partial_ordering::less);141    static_assert(std::partial_ordering::less !=142                  std::partial_ordering::equivalent);143    static_assert(std::partial_ordering::less !=144                  std::partial_ordering::greater);145    static_assert(std::partial_ordering::less !=146                  std::partial_ordering::unordered);147 148    static_assert(std::partial_ordering::equivalent !=149                  std::partial_ordering::less);150    static_assert(std::partial_ordering::equivalent ==151                  std::partial_ordering::equivalent);152    static_assert(std::partial_ordering::equivalent !=153                  std::partial_ordering::greater);154    static_assert(std::partial_ordering::equivalent !=155                  std::partial_ordering::unordered);156 157    static_assert(std::partial_ordering::greater !=158                  std::partial_ordering::less);159    static_assert(std::partial_ordering::greater !=160                  std::partial_ordering::equivalent);161    static_assert(std::partial_ordering::greater ==162                  std::partial_ordering::greater);163    static_assert(std::partial_ordering::greater !=164                  std::partial_ordering::unordered);165 166    static_assert(std::partial_ordering::unordered !=167                  std::partial_ordering::less);168    static_assert(std::partial_ordering::unordered !=169                  std::partial_ordering::equivalent);170    static_assert(std::partial_ordering::unordered !=171                  std::partial_ordering::greater);172    static_assert(std::partial_ordering::unordered ==173                  std::partial_ordering::unordered);174  }175 176  test_equality();177 178  return true;179}180 181int main(int, char**) {182  test_static_members();183  test_signatures();184  test_equality();185  static_assert(test_constexpr(), "constexpr test failed");186 187  return 0;188}189