brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 218f0c3 Raw
86 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++17, c++2010 11// template<class T2, class E2> requires (!is_void_v<T2>)12//   friend constexpr bool operator==(const expected& x, const expected<T2, E2>& y);13 14#include <cassert>15#include <concepts>16#include <expected>17#include <type_traits>18#include <utility>19 20#include "test_comparisons.h"21#include "test_macros.h"22 23// Test constraint24static_assert(!HasOperatorEqual<NonComparable, NonComparable>);25 26static_assert(HasOperatorEqual<std::expected<int, int>, std::expected<int, int>>);27static_assert(HasOperatorEqual<std::expected<int, int>, std::expected<short, short>>);28 29#if TEST_STD_VER >= 2630// https://wg21.link/P3379R031static_assert(!HasOperatorEqual<std::expected<int, int>, std::expected<void, int>>);32static_assert(HasOperatorEqual<std::expected<int, int>, std::expected<int, int>>);33static_assert(!HasOperatorEqual<std::expected<NonComparable, int>, std::expected<NonComparable, int>>);34static_assert(!HasOperatorEqual<std::expected<int, NonComparable>, std::expected<int, NonComparable>>);35static_assert(!HasOperatorEqual<std::expected<NonComparable, int>, std::expected<int, NonComparable>>);36static_assert(!HasOperatorEqual<std::expected<int, NonComparable>, std::expected<NonComparable, int>>);37#else38// Note this is true because other overloads in expected<non-void> are unconstrained39static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<int, int>>);40#endif41constexpr bool test() {42  // x.has_value() && y.has_value()43  {44    const std::expected<int, int> e1(5);45    const std::expected<int, int> e2(10);46    const std::expected<int, int> e3(5);47    assert(e1 != e2);48    assert(e1 == e3);49  }50 51  // !x.has_value() && y.has_value()52  {53    const std::expected<int, int> e1(std::unexpect, 5);54    const std::expected<int, int> e2(10);55    const std::expected<int, int> e3(5);56    assert(e1 != e2);57    assert(e1 != e3);58  }59 60  // x.has_value() && !y.has_value()61  {62    const std::expected<int, int> e1(5);63    const std::expected<int, int> e2(std::unexpect, 10);64    const std::expected<int, int> e3(std::unexpect, 5);65    assert(e1 != e2);66    assert(e1 != e3);67  }68 69  // !x.has_value() && !y.has_value()70  {71    const std::expected<int, int> e1(std::unexpect, 5);72    const std::expected<int, int> e2(std::unexpect, 10);73    const std::expected<int, int> e3(std::unexpect, 5);74    assert(e1 != e2);75    assert(e1 == e3);76  }77 78  return true;79}80 81int main(int, char**) {82  test();83  static_assert(test());84  return 0;85}86