1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// UNSUPPORTED: c++98, c++03, c++11, c++14
11// <optional>
12
13// template <class T> constexpr bool operator!=(const optional<T>& x, const optional<T>& y);
14
15#include <optional>
16#include <type_traits>
17#include <cassert>
18
19using std::optional;
20
21struct X
22{
23    int i_;
24
25    constexpr X(int i) : i_(i) {}
26};
27
28constexpr bool operator != ( const X &lhs, const X &rhs )
29    { return lhs.i_ != rhs.i_ ; }
30
31int main()
32{
33    {
34    typedef X T;
35    typedef optional<T> O;
36
37    constexpr O o1;     // disengaged
38    constexpr O o2;     // disengaged
39    constexpr O o3{1};  // engaged
40    constexpr O o4{2};  // engaged
41    constexpr O o5{1};  // engaged
42
43    static_assert ( !(o1 != o1), "" );
44    static_assert ( !(o1 != o2), "" );
45    static_assert (  (o1 != o3), "" );
46    static_assert (  (o1 != o4), "" );
47    static_assert (  (o1 != o5), "" );
48
49    static_assert ( !(o2 != o1), "" );
50    static_assert ( !(o2 != o2), "" );
51    static_assert (  (o2 != o3), "" );
52    static_assert (  (o2 != o4), "" );
53    static_assert (  (o2 != o5), "" );
54
55    static_assert (  (o3 != o1), "" );
56    static_assert (  (o3 != o2), "" );
57    static_assert ( !(o3 != o3), "" );
58    static_assert (  (o3 != o4), "" );
59    static_assert ( !(o3 != o5), "" );
60
61    static_assert (  (o4 != o1), "" );
62    static_assert (  (o4 != o2), "" );
63    static_assert (  (o4 != o3), "" );
64    static_assert ( !(o4 != o4), "" );
65    static_assert (  (o4 != o5), "" );
66
67    static_assert (  (o5 != o1), "" );
68    static_assert (  (o5 != o2), "" );
69    static_assert ( !(o5 != o3), "" );
70    static_assert (  (o5 != o4), "" );
71    static_assert ( !(o5 != o5), "" );
72
73    }
74}
75