summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2016-07-24 04:07:22 +0000
committerEric Fiselier <eric@efcs.ca>2016-07-24 04:07:22 +0000
commit63c69ef49c00ce9b018bb5b92a9391956c5d084a (patch)
treeca1b9c373085a6bfdeb946534324057be283fbff /libcxx
parente4d9c316d2e7add22fb6640000f2f3a30ed31fc0 (diff)
downloadbcm5719-llvm-63c69ef49c00ce9b018bb5b92a9391956c5d084a.tar.gz
bcm5719-llvm-63c69ef49c00ce9b018bb5b92a9391956c5d084a.zip
Implement LWG2328. Rvalue stream extraction should perfect forward.
llvm-svn: 276545
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/istream4
-rw-r--r--libcxx/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp21
-rw-r--r--libcxx/www/cxx1z_status.html2
3 files changed, 18 insertions, 9 deletions
diff --git a/libcxx/include/istream b/libcxx/include/istream
index ee694003a3d..3a76ba831d3 100644
--- a/libcxx/include/istream
+++ b/libcxx/include/istream
@@ -1481,9 +1481,9 @@ ws(basic_istream<_CharT, _Traits>& __is)
template <class _CharT, class _Traits, class _Tp>
inline _LIBCPP_INLINE_VISIBILITY
basic_istream<_CharT, _Traits>&
-operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
+operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
{
- __is >> __x;
+ __is >> _VSTD::forward<_Tp>(__x);
return __is;
}
diff --git a/libcxx/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp b/libcxx/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp
index 5b7664e3f55..77c41b09ad7 100644
--- a/libcxx/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp
+++ b/libcxx/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp
@@ -7,17 +7,18 @@
//
//===----------------------------------------------------------------------===//
+// UNSUPPORTED: c++98, c++03
+
// <istream>
// template <class charT, class traits, class T>
// basic_istream<charT, traits>&
-// operator>>(basic_istream<charT, traits>&& is, T& x);
+// operator>>(basic_istream<charT, traits>&& is, T&& x);
#include <istream>
+#include <sstream>
#include <cassert>
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-
template <class CharT>
struct testbuf
: public std::basic_streambuf<CharT>
@@ -42,11 +43,13 @@ public:
CharT* egptr() const {return base::egptr();}
};
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+struct A{};
+bool called = false;
+void operator>>(std::istream&, A&&){ called = true; }
int main()
{
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
testbuf<char> sb(" 123");
int i = 0;
@@ -59,5 +62,11 @@ int main()
std::wistream(&sb) >> i;
assert(i == 123);
}
-#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ { // test perfect forwarding
+ assert(called == false);
+ std::istringstream ss;
+ auto& out = (std::move(ss) >> A{});
+ assert(&out == &ss);
+ assert(called);
+ }
}
diff --git a/libcxx/www/cxx1z_status.html b/libcxx/www/cxx1z_status.html
index 3af3806172d..db3eb839af1 100644
--- a/libcxx/www/cxx1z_status.html
+++ b/libcxx/www/cxx1z_status.html
@@ -264,7 +264,7 @@
<tr><td><a href="http://wg21.link/LWG2309">2309</a></td><td>mutex::lock() should not throw device_or_resource_busy</td><td>Oulu</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2310">2310</a></td><td>Public exposition only member in std::array</td><td>Oulu</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2312">2312</a></td><td>tuple's constructor constraints need to be phrased more precisely</td><td>Oulu</td><td>Complete</td></tr>
- <tr><td><a href="http://wg21.link/LWG2328">2328</a></td><td>Rvalue stream extraction should use perfect forwarding</td><td>Oulu</td><td></td></tr>
+ <tr><td><a href="http://wg21.link/LWG2328">2328</a></td><td>Rvalue stream extraction should use perfect forwarding</td><td>Oulu</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2393">2393</a></td><td>std::function's Callable definition is broken</td><td>Oulu</td><td></td></tr>
<tr><td><a href="http://wg21.link/LWG2422">2422</a></td><td>std::numeric_limits&lt;T&gt;::is_modulo description: "most machines" errata</td><td>Oulu</td><td>Complete</td></tr>
<tr><td><a href="http://wg21.link/LWG2426">2426</a></td><td>Issue about compare_exchange</td><td>Oulu</td><td></td></tr>
OpenPOWER on IntegriCloud