From 954014a0fac4feb14e77eaa0b95d96f8095383b2 Mon Sep 17 00:00:00 2001
From: Marshall Clow <mclow.lists@gmail.com>
Date: Thu, 27 Jun 2019 18:40:55 +0000
Subject: [PATCH] Add a missing '__uncvref_t' to the SFINAE constraints for
 optional's assignment operator. Fixes PR38638. Thanks to Jonathan Wakely for
 the report

llvm-svn: 364574
---
 libcxx/include/optional                              |  2 +-
 .../optional.object.assign/assign_value.pass.cpp     | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/libcxx/include/optional b/libcxx/include/optional
index 2fad11ce419e..a147d69da00f 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -773,7 +773,7 @@ public:
                       _And<
                           _IsNotSame<__uncvref_t<_Up>, optional>,
                           _Or<
-                              _IsNotSame<_Up, value_type>,
+                              _IsNotSame<__uncvref_t<_Up>, value_type>,
                               _Not<is_scalar<value_type>>
                           >,
                           is_constructible<value_type, _Up>,
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
index 8d2a8a00c943..3dd28ace26fd 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
@@ -241,6 +241,16 @@ enum MyEnum { Zero, One, Two, Three, FortyTwo = 42 };
 
 using Fn = void(*)();
 
+// https://bugs.llvm.org/show_bug.cgi?id=38638
+template <class T>
+constexpr T pr38638(T v)
+{
+  std::optional<T> o;
+  o = v;
+  return *o + 2;
+}
+
+
 int main(int, char**)
 {
     test_sfinae();
@@ -269,5 +279,7 @@ int main(int, char**)
     }
     test_throws();
 
+    static_assert(pr38638(3) == 5, "");
+
   return 0;
 }