default-expr-arguments.cpp revision a29e51bb9874bb9ce442efa271e87da237e4ce2c
19351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson// RUN: clang-cc -fsyntax-only -verify %s 29351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 3d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregortemplate<typename T> 4d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregorclass C { C(int a0 = 0); }; 5d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregor 6d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregortemplate<> 7d85cef5a54074a5f647f45c2218675f7774a909dDouglas GregorC<char>::C(int a0); 8d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregor 99351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssonstruct S { }; 109351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 119351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssontemplate<typename T> void f1(T a, T b = 10) { } // expected-error{{cannot initialize 'b' with an rvalue of type 'int'}} 129351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 139351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssontemplate<typename T> void f2(T a, T b = T()) { } 149351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 159351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssontemplate<typename T> void f3(T a, T b = T() + T()); // expected-error{{invalid operands to binary expression ('struct S' and 'struct S')}} 169351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 179351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssonvoid g() { 189351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson f1(10); 1925cae7f4b1155b1a6ca959ea5143ea39eae656cdAnders Carlsson f1(S()); // expected-note{{in instantiation of default function argument expression for 'f1<struct S>' required here}} 209351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 219351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson f2(10); 229351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson f2(S()); 239351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson 249351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson f3(10); 2525cae7f4b1155b1a6ca959ea5143ea39eae656cdAnders Carlsson f3(S()); // expected-note{{in instantiation of default function argument expression for 'f3<struct S>' required here}} 269351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson} 278644aecd4383ce829d1eed81e96399904a948362Anders Carlsson 288644aecd4383ce829d1eed81e96399904a948362Anders Carlssontemplate<typename T> struct F { 2921e1c4ea0a96bcecfe5976304d84779949058648Anders Carlsson F(T t = 10); // expected-error{{cannot initialize 't' with an rvalue of type 'int'}} 306bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson void f(T t = 10); // expected-error{{cannot initialize 't' with an rvalue of type 'int'}} 318644aecd4383ce829d1eed81e96399904a948362Anders Carlsson}; 328644aecd4383ce829d1eed81e96399904a948362Anders Carlsson 330b84a53412a6acac38e2d647d220ce7af851395eDouglas Gregorstruct FD : F<int> { }; 340b84a53412a6acac38e2d647d220ce7af851395eDouglas Gregor 358644aecd4383ce829d1eed81e96399904a948362Anders Carlssonvoid g2() { 3625cae7f4b1155b1a6ca959ea5143ea39eae656cdAnders Carlsson F<int> f; 370b84a53412a6acac38e2d647d220ce7af851395eDouglas Gregor FD fd; 388644aecd4383ce829d1eed81e96399904a948362Anders Carlsson} 395653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson 406bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlssonvoid g3(F<int> f, F<struct S> s) { 416bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson f.f(); 426bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson s.f(); // expected-note{{in instantiation of default function argument expression for 'f<struct S>' required here}} 4321e1c4ea0a96bcecfe5976304d84779949058648Anders Carlsson 4421e1c4ea0a96bcecfe5976304d84779949058648Anders Carlsson F<int> f2; 4521e1c4ea0a96bcecfe5976304d84779949058648Anders Carlsson F<S> s2; // expected-note{{in instantiation of default function argument expression for 'F<struct S>' required here}} 466bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson} 476bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson 485653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlssontemplate<typename T> struct G { 4925cae7f4b1155b1a6ca959ea5143ea39eae656cdAnders Carlsson G(T) {} 505653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson}; 515653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson 525653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlssonvoid s(G<int> flags = 10) { } 535653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson 546cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor// Test default arguments 556cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregortemplate<typename T> 566cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorstruct X0 { 576cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor void f(T = T()); // expected-error{{no matching}} 586cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor}; 596cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor 606cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregortemplate<typename U> 616cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid X0<U>::f(U) { } 626cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor 636cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid test_x0(X0<int> xi) { 646cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor xi.f(); 656cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor xi.f(17); 666cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor} 675653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson 686cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorstruct NotDefaultConstructible { // expected-note{{candidate}} 696cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor NotDefaultConstructible(int); // expected-note{{candidate}} 706cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor}; 716bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson 726cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid test_x0_not_default_constructible(X0<NotDefaultConstructible> xn) { 736cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor xn.f(NotDefaultConstructible(17)); 746cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor xn.f(42); 756cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor xn.f(); // expected-note{{in instantiation of default function argument}} 766cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor} 77e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 78e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregortemplate<typename T> 79e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregorstruct X1 { 80e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor typedef T value_type; 81e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor X1(const value_type& value = value_type()); 82e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor}; 83e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 84e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregorvoid test_X1() { 85e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor X1<int> x1; 86e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor} 870ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson 880ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson// PR5283 890ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonnamespace PR5283 { 900ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssontemplate<typename T> struct A { 910ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson A(T = 1); // expected-error 3 {{incompatible type initializing 'int', expected 'int *'}} 920ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson}; 930ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson 940ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonstruct B : A<int*> { 950ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson B(); 960ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson}; 970ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders CarlssonB::B() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}} 980ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson 990ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonstruct C : virtual A<int*> { 1000ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson C(); 1010ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson}; 1020ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders CarlssonC::C() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}} 1030ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson 1040ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonstruct D { 1050ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson D(); 1060ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson 1070ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson A<int*> a; 1080ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson}; 1090ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders CarlssonD::D() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}} 1100ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson} 111a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl 112a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl// PR5301 113a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redlnamespace pr5301 { 114a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl void f(int, int = 0); 115a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl 116a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl template <typename T> 117a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl void g(T, T = 0); 118a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl 119a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl template <int I> 120a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl void i(int a = I); 121a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl 122a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl template <typename T> 123a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl void h(T t) { 124a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl f(0); 125a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl g(1); 126a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl g(t); 127a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl i<2>(); 128a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl } 129a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl 130a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl void test() { 131a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl h(0); 132a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl } 133a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl} 134