// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s // RUN: %clang_cc1 -std=c++1z -fsyntax-only -verify %s // A forwarding reference is an rvalue reference to a cv-unqualified template // parameter that does not represent a template parameter of a class template. #if __cplusplus > 201402L namespace ClassTemplateParamNotForwardingRef { // This is not a forwarding reference. template struct A { // expected-note {{candidate}} A(T&&); // expected-note {{no known conversion from 'int' to 'int &&'}} }; int n; A a = n; // expected-error {{no viable constructor or deduction guide}} A b = 0; A *pb = &b; // This is a forwarding reference. template A(T&&) -> A; A c = n; A *pc = &c; A d = 0; A *pd = &d; template struct B { // This is a forwarding reference. template B(U &&); }; B e = n; B *pe = &e; } #endif // If P is a forwarding reference 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'}} #if __cplusplus > 201402L template struct A { // expected-note {{candidate}} template A(T &&, U &&, int *); // expected-note {{[with T = int, U = int] not viable: no known conversion from 'int' to 'int &&'}} A(T &&, int *); // expected-note {{requires 2}} }; template A(T &&, int *) -> A; // expected-note {{requires 2}} int *ip; A a{i, 0, ip}; // expected-error {{no viable constructor or deduction guide}} A a0{0, 0, ip}; A a2{i, ip}; A &a0r = a0; A &a2r = a2; #endif }