From: Douglas Gregor Date: Fri, 21 Jan 2011 22:52:47 +0000 (+0000) Subject: Add a test for "perfect" forwarding X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5232011c942820bba5d033fbd4aa06d4bcbeb6c6;p=clang Add a test for "perfect" forwarding git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124005 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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 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 + void forward(F f, Args &&...args) { + f(static_cast(args)...); // expected-error{{no matching function for call to object of type 'perfect_forwarding::F0'}} + } + + template T get(); + + void test_forward() { + forward(F0(), get(), get(), get(), get(), + get(), get()); + forward(F0(), get(), get(), get(), get(), // expected-note{{in instantiation of function template specialization 'perfect_forwarding::forward' requested here}} + get(), get()); + } +};