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