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, class U> constexpr bool operator!=(const optional<T>& x, const U& v); 14// template <class T, class U> constexpr bool operator!=(const U& v, const optional<T>& x); 15 16#include <optional> 17 18using std::optional; 19 20struct X { 21 int i_; 22 23 constexpr X(int i) : i_(i) {} 24}; 25 26constexpr bool operator!=(const X& lhs, const X& rhs) { 27 return lhs.i_ != rhs.i_; 28} 29 30int main() { 31 { 32 typedef X T; 33 typedef optional<T> O; 34 35 constexpr T val(2); 36 constexpr O o1; // disengaged 37 constexpr O o2{1}; // engaged 38 constexpr O o3{val}; // engaged 39 40 static_assert((o1 != T(1)), ""); 41 static_assert(!(o2 != T(1)), ""); 42 static_assert((o3 != T(1)), ""); 43 static_assert(!(o3 != T(2)), ""); 44 static_assert(!(o3 != val), ""); 45 46 static_assert((T(1) != o1), ""); 47 static_assert(!(T(1) != o2), ""); 48 static_assert((T(1) != o3), ""); 49 static_assert(!(T(2) != o3), ""); 50 static_assert(!(val != o3), ""); 51 } 52 { 53 using O = optional<int>; 54 constexpr O o1(42); 55 static_assert(o1 != 101l, ""); 56 static_assert(!(42l != o1), ""); 57 } 58 { 59 using O = optional<const int>; 60 constexpr O o1(42); 61 static_assert(o1 != 101, ""); 62 static_assert(!(42 != o1), ""); 63 } 64} 65