// 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}} \ // expected-note{{passing argument to parameter 'b' here}} template void f2(T a, T b = T()) { } template void f3(T a, T b = T() + T()); // expected-error{{invalid operands to binary expression ('S' and '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}} \ // expected-note{{passing argument to parameter 't' here}} void f(T t = 10); // expected-error{{no viable conversion}} \ // expected-note{{passing argument to parameter 't' here}} }; 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'}} \ // expected-note 3{{passing argument to parameter here}} }; 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 with a negative size}} }; 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); } // Instantiate for initialization namespace InstForInit { template struct Ptr { typedef T* type; Ptr(type); }; template struct Holder { Holder(int i, Ptr ptr = 0); }; void test_holder(int i) { Holder h(i); } }; namespace PR5810b { template T broken() { T t; double**** not_it = t; } void f(int = broken()); void g() { f(17); } } namespace PR5810c { template struct X { X() { T t; double *****p = t; // expected-error{{cannot initialize a variable of type 'double *****' with an lvalue of type 'int'}} } X(const X&) { } }; struct Y : X { // expected-note{{instantiation of}} }; void f(Y y = Y()); void g() { f(); } } namespace PR8127 { template< typename T > class PointerClass { public: PointerClass( T * object_p ) : p_( object_p ) { p_->acquire(); } private: T * p_; }; class ExternallyImplementedClass; class MyClass { void foo( PointerClass = 0 ); }; } namespace rdar8427926 { template struct Boom { ~Boom() { T t; double *******ptr = t; // expected-error 2{{cannot initialize}} } }; Boom *bfp; struct X { void f(Boom = Boom()) { } // expected-note{{requested here}} void g(int x = (delete bfp, 0)); // expected-note{{requested here}} }; void test(X *x) { x->f(); x->g(); } } namespace PR8401 { template struct A { A() { T* x = 1; } // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} }; template struct B { B(const A& a = A()); // expected-note{{in instantiation of}} }; void f(B b = B()); void g() { f(); } } namespace PR12581 { const int a = 0; template < typename > struct A; template < typename MatrixType, int = A < MatrixType >::Flags ? : A < MatrixType >::Flags & a > class B; void fn1 () { } }