// RUN: clang-cc -fsyntax-only -verify %s struct S { }; template void f1(T a, T b = 10) { } // expected-error{{cannot initialize 'b' with an rvalue of type 'int'}} template void f2(T a, T b = T()) { } template void f3(T a, T b = T() + T()); // expected-error{{invalid operands to binary expression ('struct S' and 'struct S')}} void g() { f1(10); f1(S()); // expected-note{{in instantiation of default function argument expression for 'f1' required here}} f2(10); f2(S()); f3(10); f3(S()); // expected-note{{in instantiation of default function argument expression for 'f3' required here}} } template struct F { F(T t = 10); // expected-error{{cannot initialize 't' with an rvalue of type 'int'}} void f(T t = 10); // expected-error{{cannot initialize 't' with an rvalue of type 'int'}} }; struct FD : F { }; void g2() { F f; FD fd; } void g3(F f, F s) { f.f(); s.f(); // expected-note{{in instantiation of default function argument expression for 'f' required here}} F f2; F s2; // expected-note{{in instantiation of default function argument expression for 'F' required here}} } template struct G { G(T) {} }; void s(G flags = 10) { } // Test default arguments template struct X0 { void f(T = T()); // expected-error{{no matching}} }; template void X0::f(U) { } void test_x0(X0 xi) { xi.f(); xi.f(17); } struct NotDefaultConstructible { // expected-note{{candidate}} NotDefaultConstructible(int); // expected-note{{candidate}} }; void test_x0_not_default_constructible(X0 xn) { xn.f(NotDefaultConstructible(17)); xn.f(42); xn.f(); // expected-note{{in instantiation of default function argument}} } template struct X1 { typedef T value_type; X1(const value_type& value = value_type()); }; void test_X1() { X1 x1; }