aboutsummaryrefslogtreecommitdiff
path: root/test/SemaCXX/rval-references-examples.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-21 22:52:47 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-21 22:52:47 +0000
commit5232011c942820bba5d033fbd4aa06d4bcbeb6c6 (patch)
tree5a9b2f399a4d3c437cd72e164c3799d00df7f95b /test/SemaCXX/rval-references-examples.cpp
parentdcfb360f6e1aaab0754a98e1e245c2607c46058a (diff)
Add a test for "perfect" forwarding
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124005 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaCXX/rval-references-examples.cpp')
-rw-r--r--test/SemaCXX/rval-references-examples.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/test/SemaCXX/rval-references-examples.cpp b/test/SemaCXX/rval-references-examples.cpp
index 778924d657..f4921a9b51 100644
--- a/test/SemaCXX/rval-references-examples.cpp
+++ b/test/SemaCXX/rval-references-examples.cpp
@@ -88,3 +88,25 @@ unique_ptr<int> test_unique_ptr() {
return p;
}
+
+namespace perfect_forwarding {
+ struct A { };
+
+ struct F0 {
+ void operator()(A&, const A&, A&&, const A&&, A&&, const A&&); // expected-note{{candidate function not viable: 5th argument ('const perfect_forwarding::A') would lose const qualifier}}
+ };
+
+ template<typename F, typename ...Args>
+ void forward(F f, Args &&...args) {
+ f(static_cast<Args&&>(args)...); // expected-error{{no matching function for call to object of type 'perfect_forwarding::F0'}}
+ }
+
+ template<typename T> T get();
+
+ void test_forward() {
+ forward(F0(), get<A&>(), get<A const&>(), get<A>(), get<const A>(),
+ get<A&&>(), get<const A&&>());
+ forward(F0(), get<A&>(), get<A const&>(), get<A>(), get<const A>(), // expected-note{{in instantiation of function template specialization 'perfect_forwarding::forward<perfect_forwarding::F0, perfect_forwarding::A &, const perfect_forwarding::A &, perfect_forwarding::A, const perfect_forwarding::A, const perfect_forwarding::A, const perfect_forwarding::A>' requested here}}
+ get<const A&&>(), get<const A&&>());
+ }
+};