diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-21 22:52:47 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-21 22:52:47 +0000 |
commit | 5232011c942820bba5d033fbd4aa06d4bcbeb6c6 (patch) | |
tree | 5a9b2f399a4d3c437cd72e164c3799d00df7f95b /test/SemaCXX/rval-references-examples.cpp | |
parent | dcfb360f6e1aaab0754a98e1e245c2607c46058a (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.cpp | 22 |
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&&>()); + } +}; |