Fix LWG 2934 - optional<const T> doesn't compare with T

llvm-svn: 299105
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: dc808af38d4b073cb9d63e3e40762b189d5ae3af
diff --git a/include/optional b/include/optional
index a80120f..10ad31e 100644
--- a/include/optional
+++ b/include/optional
@@ -921,14 +921,14 @@
 };
 
 // Comparisons between optionals
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator==(const optional<_Tp>& __x, const optional<_Tp>& __y)
+operator==(const optional<_Tp>& __x, const optional<_Up>& __y)
 {
     if (static_cast<bool>(__x) != static_cast<bool>(__y))
         return false;
@@ -937,14 +937,14 @@
     return *__x == *__y;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator!=(const optional<_Tp>& __x, const optional<_Tp>& __y)
+operator!=(const optional<_Tp>& __x, const optional<_Up>& __y)
 {
     if (static_cast<bool>(__x) != static_cast<bool>(__y))
         return true;
@@ -953,14 +953,14 @@
     return *__x != *__y;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator<(const optional<_Tp>& __x, const optional<_Tp>& __y)
+operator<(const optional<_Tp>& __x, const optional<_Up>& __y)
 {
     if (!static_cast<bool>(__y))
         return false;
@@ -969,14 +969,14 @@
     return *__x < *__y;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator>(const optional<_Tp>& __x, const optional<_Tp>& __y)
+operator>(const optional<_Tp>& __x, const optional<_Up>& __y)
 {
     if (!static_cast<bool>(__x))
         return false;
@@ -985,14 +985,14 @@
     return *__x > *__y;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator<=(const optional<_Tp>& __x, const optional<_Tp>& __y)
+operator<=(const optional<_Tp>& __x, const optional<_Up>& __y)
 {
     if (!static_cast<bool>(__x))
         return true;
@@ -1001,14 +1001,14 @@
     return *__x <= *__y;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator>=(const optional<_Tp>& __x, const optional<_Tp>& __y)
+operator>=(const optional<_Tp>& __x, const optional<_Up>& __y)
 {
     if (!static_cast<bool>(__y))
         return true;
@@ -1115,146 +1115,146 @@
 }
 
 // Comparisons with T
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator==(const optional<_Tp>& __x, const _Tp& __v)
+operator==(const optional<_Tp>& __x, const _Up& __v)
 {
     return static_cast<bool>(__x) ? *__x == __v : false;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator==(const _Tp& __v, const optional<_Tp>& __x)
+operator==(const _Tp& __v, const optional<_Up>& __x)
 {
     return static_cast<bool>(__x) ? __v == *__x : false;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator!=(const optional<_Tp>& __x, const _Tp& __v)
+operator!=(const optional<_Tp>& __x, const _Up& __v)
 {
     return static_cast<bool>(__x) ? *__x != __v : true;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator!=(const _Tp& __v, const optional<_Tp>& __x)
+operator!=(const _Tp& __v, const optional<_Up>& __x)
 {
     return static_cast<bool>(__x) ? __v != *__x : true;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator<(const optional<_Tp>& __x, const _Tp& __v)
+operator<(const optional<_Tp>& __x, const _Up& __v)
 {
     return static_cast<bool>(__x) ? *__x < __v : true;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator<(const _Tp& __v, const optional<_Tp>& __x)
+operator<(const _Tp& __v, const optional<_Up>& __x)
 {
     return static_cast<bool>(__x) ? __v < *__x : false;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator<=(const optional<_Tp>& __x, const _Tp& __v)
+operator<=(const optional<_Tp>& __x, const _Up& __v)
 {
     return static_cast<bool>(__x) ? *__x <= __v : true;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator<=(const _Tp& __v, const optional<_Tp>& __x)
+operator<=(const _Tp& __v, const optional<_Up>& __x)
 {
     return static_cast<bool>(__x) ? __v <= *__x : false;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator>(const optional<_Tp>& __x, const _Tp& __v)
+operator>(const optional<_Tp>& __x, const _Up& __v)
 {
     return static_cast<bool>(__x) ? *__x > __v : false;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator>(const _Tp& __v, const optional<_Tp>& __x)
+operator>(const _Tp& __v, const optional<_Up>& __x)
 {
     return static_cast<bool>(__x) ? __v > *__x : true;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator>=(const optional<_Tp>& __x, const _Tp& __v)
+operator>=(const optional<_Tp>& __x, const _Up& __v)
 {
     return static_cast<bool>(__x) ? *__x >= __v : false;
 }
 
-template <class _Tp>
+template <class _Tp, class _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
 enable_if_t<
     is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
-        _VSTD::declval<const _Tp&>()), bool>,
+        _VSTD::declval<const _Up&>()), bool>,
     bool
 >
-operator>=(const _Tp& __v, const optional<_Tp>& __x)
+operator>=(const _Tp& __v, const optional<_Up>& __x)
 {
     return static_cast<bool>(__x) ? __v >= *__x : true;
 }