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