// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s // If P is an rvalue reference to a cv-unqualified template parameter // and the argument is an lvalue, the type "lvalue reference to A" is // used in place of A for type deduction. template struct X { }; template X f0(T&&); struct Y { }; template T prvalue(); template T&& xvalue(); template T& lvalue(); void test_f0() { X xi0 = f0(prvalue()); X xi1 = f0(xvalue()); X xi2 = f0(lvalue()); X xy0 = f0(prvalue()); X xy1 = f0(xvalue()); X xy2 = f0(lvalue()); } template X f1(const T&&); // expected-note{{candidate function [with T = int] not viable: no known conversion from 'int' to 'const int &&' for 1st argument}} \ // expected-note{{candidate function [with T = Y] not viable: no known conversion from 'Y' to 'const Y &&' for 1st argument}} void test_f1() { X xi0 = f1(prvalue()); X xi1 = f1(xvalue()); f1(lvalue()); // expected-error{{no matching function for call to 'f1'}} X xy0 = f1(prvalue()); X xy1 = f1(xvalue()); f1(lvalue()); // expected-error{{no matching function for call to 'f1'}} } namespace std_example { template int f(T&&); template int g(const T&&); // expected-note{{candidate function [with T = int] not viable: no known conversion from 'int' to 'const int &&' for 1st argument}} int i; int n1 = f(i); int n2 = f(0); int n3 = g(i); // expected-error{{no matching function for call to 'g'}} }