// RUN: %clang_cc1 -fsyntax-only -verify %s template class C { C(int a0 = 0); }; template<> C::C(int a0); struct S { }; // expected-note 3 {{candidate constructor (the implicit copy constructor)}} template void f1(T a, T b = 10) { } // expected-error{{no viable conversion}} 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{{no viable conversion}} void f(T t = 10); // expected-error{{no viable conversion}} }; 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 2{{candidate}} NotDefaultConstructible(int); // expected-note 2{{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; } template struct X2 { void operator()(T = T()); // expected-error{{no matching}} }; void test_x2(X2 x2i, X2 x2n) { x2i(); x2i(17); x2n(NotDefaultConstructible(17)); x2n(); // expected-note{{in instantiation of default function argument}} } // PR5283 namespace PR5283 { template struct A { A(T = 1); // expected-error 3 {{cannot initialize a parameter of type 'int *' with an rvalue of type 'int'}} }; struct B : A { B(); }; B::B() { } // expected-note {{in instantiation of default function argument expression for 'A' required he}} struct C : virtual A { C(); }; C::C() { } // expected-note {{in instantiation of default function argument expression for 'A' required he}} struct D { D(); A a; }; D::D() { } // expected-note {{in instantiation of default function argument expression for 'A' required he}} } // PR5301 namespace pr5301 { void f(int, int = 0); template void g(T, T = 0); template void i(int a = I); template void h(T t) { f(0); g(1); g(t); i<2>(); } void test() { h(0); } } // PR5810 namespace PR5810 { template struct allocator { allocator() { int a[sizeof(T) ? -1 : -1]; } // expected-error2 {{array size is negative}} }; template struct vector { vector(const allocator& = allocator()) {} // expected-note2 {{instantiation of}} }; struct A { }; struct B { }; template void FilterVTs() { vector Result; } void f() { vector Result; } template struct X { vector bs; X() { } }; void f2() { X x; // expected-note{{member function}} } } template void f4(T, int = 17); template<> void f4(int, int); void f4_test(int i) { f4(i); }