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