Implement P0084r2. Changing emplace return types.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@276230 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/forward_list b/include/forward_list
index 18b300d..41b4b46 100644
--- a/include/forward_list
+++ b/include/forward_list
@@ -87,7 +87,7 @@
     reference       front();
     const_reference front() const;
 
-    template <class... Args> void emplace_front(Args&&... args);
+    template <class... Args> reference emplace_front(Args&&... args);
     void push_front(const value_type& v);
     void push_front(value_type&& v);
 
@@ -744,7 +744,7 @@
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 #ifndef _LIBCPP_HAS_NO_VARIADICS
-    template <class... _Args> void emplace_front(_Args&&... __args);
+    template <class... _Args> reference emplace_front(_Args&&... __args);
 #endif
     void push_front(value_type&& __v);
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1099,7 +1099,7 @@
 
 template <class _Tp, class _Alloc>
 template <class... _Args>
-void
+typename forward_list<_Tp, _Alloc>::reference
 forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
 {
     __node_allocator& __a = base::__alloc();
@@ -1109,6 +1109,7 @@
                                   _VSTD::forward<_Args>(__args)...);
     __h->__next_ = base::__before_begin()->__next_;
     base::__before_begin()->__next_ = __h.release();
+    return base::__before_begin()->__next_->__value_;
 }
 
 #endif  // _LIBCPP_HAS_NO_VARIADICS