Implement LWG#2948: unique_ptr does not define operator<< for stream output

llvm-svn: 319038
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 48f365399936d6ecb38f57f4cf72a870896d954d
diff --git a/include/ostream b/include/ostream
index 9bf8d3c..92f7f4d 100644
--- a/include/ostream
+++ b/include/ostream
@@ -1071,6 +1071,18 @@
     return __os << __p.get();
 }
 
+template<class _CharT, class _Traits, class _Yp, class _Dp>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+    is_same<void, typename __void_t<decltype(declval<basic_ostream<_CharT, _Traits>&>() << declval<_Yp>())>::type>::value,
+    basic_ostream<_CharT, _Traits>&
+>::type
+operator<<(basic_ostream<_CharT, _Traits>& __os, unique_ptr<_Yp, _Dp> const& __p)
+{
+    return __os << __p.get();
+}
+
 template <class _CharT, class _Traits, size_t _Size>
 basic_ostream<_CharT, _Traits>&
 operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)