xref: /llvm-project/libcxx/test/std/utilities/variant/variant.relops/relops_bool_conv.verify.cpp (revision 9bb9ec380ace81d040d3a0a0a2ae9a75733ab330)
1b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
2b82dcb62SLouis Dionne //
3b82dcb62SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b82dcb62SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5b82dcb62SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b82dcb62SLouis Dionne //
7b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
8b82dcb62SLouis Dionne 
9b82dcb62SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10b82dcb62SLouis Dionne 
11b82dcb62SLouis Dionne // <variant>
12b82dcb62SLouis Dionne 
13b82dcb62SLouis Dionne // template <class ...Types>
14b82dcb62SLouis Dionne // constexpr bool
15b82dcb62SLouis Dionne // operator==(variant<Types...> const&, variant<Types...> const&) noexcept;
16b82dcb62SLouis Dionne //
17b82dcb62SLouis Dionne // template <class ...Types>
18b82dcb62SLouis Dionne // constexpr bool
19b82dcb62SLouis Dionne // operator!=(variant<Types...> const&, variant<Types...> const&) noexcept;
20b82dcb62SLouis Dionne //
21b82dcb62SLouis Dionne // template <class ...Types>
22b82dcb62SLouis Dionne // constexpr bool
23b82dcb62SLouis Dionne // operator<(variant<Types...> const&, variant<Types...> const&) noexcept;
24b82dcb62SLouis Dionne //
25b82dcb62SLouis Dionne // template <class ...Types>
26b82dcb62SLouis Dionne // constexpr bool
27b82dcb62SLouis Dionne // operator>(variant<Types...> const&, variant<Types...> const&) noexcept;
28b82dcb62SLouis Dionne //
29b82dcb62SLouis Dionne // template <class ...Types>
30b82dcb62SLouis Dionne // constexpr bool
31b82dcb62SLouis Dionne // operator<=(variant<Types...> const&, variant<Types...> const&) noexcept;
32b82dcb62SLouis Dionne //
33b82dcb62SLouis Dionne // template <class ...Types>
34b82dcb62SLouis Dionne // constexpr bool
35b82dcb62SLouis Dionne // operator>=(variant<Types...> const&, variant<Types...> const&) noexcept;
36b82dcb62SLouis Dionne 
37b82dcb62SLouis Dionne #include <cassert>
38b82dcb62SLouis Dionne #include <type_traits>
39b82dcb62SLouis Dionne #include <utility>
40b82dcb62SLouis Dionne #include <variant>
41b82dcb62SLouis Dionne 
42b82dcb62SLouis Dionne #include "test_macros.h"
43b82dcb62SLouis Dionne 
44b82dcb62SLouis Dionne 
45b82dcb62SLouis Dionne struct MyBoolExplicit {
46b82dcb62SLouis Dionne   bool value;
MyBoolExplicitMyBoolExplicit47b82dcb62SLouis Dionne   constexpr explicit MyBoolExplicit(bool v) : value(v) {}
operator boolMyBoolExplicit48b82dcb62SLouis Dionne   constexpr explicit operator bool() const noexcept { return value; }
49b82dcb62SLouis Dionne };
50b82dcb62SLouis Dionne 
51b82dcb62SLouis Dionne struct ComparesToMyBoolExplicit {
52b82dcb62SLouis Dionne   int value = 0;
53b82dcb62SLouis Dionne };
operator ==(const ComparesToMyBoolExplicit & LHS,const ComparesToMyBoolExplicit & RHS)54b82dcb62SLouis Dionne inline constexpr MyBoolExplicit operator==(const ComparesToMyBoolExplicit& LHS, const ComparesToMyBoolExplicit& RHS) noexcept {
55b82dcb62SLouis Dionne   return MyBoolExplicit(LHS.value == RHS.value);
56b82dcb62SLouis Dionne }
operator !=(const ComparesToMyBoolExplicit & LHS,const ComparesToMyBoolExplicit & RHS)57b82dcb62SLouis Dionne inline constexpr MyBoolExplicit operator!=(const ComparesToMyBoolExplicit& LHS, const ComparesToMyBoolExplicit& RHS) noexcept {
58b82dcb62SLouis Dionne   return MyBoolExplicit(LHS.value != RHS.value);
59b82dcb62SLouis Dionne }
operator <(const ComparesToMyBoolExplicit & LHS,const ComparesToMyBoolExplicit & RHS)60b82dcb62SLouis Dionne inline constexpr MyBoolExplicit operator<(const ComparesToMyBoolExplicit& LHS, const ComparesToMyBoolExplicit& RHS) noexcept {
61b82dcb62SLouis Dionne   return MyBoolExplicit(LHS.value < RHS.value);
62b82dcb62SLouis Dionne }
operator <=(const ComparesToMyBoolExplicit & LHS,const ComparesToMyBoolExplicit & RHS)63b82dcb62SLouis Dionne inline constexpr MyBoolExplicit operator<=(const ComparesToMyBoolExplicit& LHS, const ComparesToMyBoolExplicit& RHS) noexcept {
64b82dcb62SLouis Dionne   return MyBoolExplicit(LHS.value <= RHS.value);
65b82dcb62SLouis Dionne }
operator >(const ComparesToMyBoolExplicit & LHS,const ComparesToMyBoolExplicit & RHS)66b82dcb62SLouis Dionne inline constexpr MyBoolExplicit operator>(const ComparesToMyBoolExplicit& LHS, const ComparesToMyBoolExplicit& RHS) noexcept {
67b82dcb62SLouis Dionne   return MyBoolExplicit(LHS.value > RHS.value);
68b82dcb62SLouis Dionne }
operator >=(const ComparesToMyBoolExplicit & LHS,const ComparesToMyBoolExplicit & RHS)69b82dcb62SLouis Dionne inline constexpr MyBoolExplicit operator>=(const ComparesToMyBoolExplicit& LHS, const ComparesToMyBoolExplicit& RHS) noexcept {
70b82dcb62SLouis Dionne   return MyBoolExplicit(LHS.value >= RHS.value);
71b82dcb62SLouis Dionne }
72b82dcb62SLouis Dionne 
73b82dcb62SLouis Dionne 
main(int,char **)74b82dcb62SLouis Dionne int main(int, char**) {
75b82dcb62SLouis Dionne   using V = std::variant<int, ComparesToMyBoolExplicit>;
76b82dcb62SLouis Dionne   V v1(42);
77b82dcb62SLouis Dionne   V v2(101);
78*9bb9ec38SLouis Dionne   // expected-error-re@variant:* 6 {{static assertion failed{{.*}}the relational operator does not return a type which is implicitly convertible to bool}}
79b82dcb62SLouis Dionne   // expected-error@variant:* 6 {{no viable conversion}}
80b82dcb62SLouis Dionne   (void)(v1 == v2); // expected-note {{here}}
81b82dcb62SLouis Dionne   (void)(v1 != v2); // expected-note {{here}}
82b82dcb62SLouis Dionne   (void)(v1 < v2); // expected-note {{here}}
83b82dcb62SLouis Dionne   (void)(v1 <= v2); // expected-note {{here}}
84b82dcb62SLouis Dionne   (void)(v1 > v2); // expected-note {{here}}
85b82dcb62SLouis Dionne   (void)(v1 >= v2); // expected-note {{here}}
86b82dcb62SLouis Dionne 
87b82dcb62SLouis Dionne   return 0;
88b82dcb62SLouis Dionne }
89