1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregortemplate<typename T>
3d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregorclass C { C(int a0 = 0); };
4d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregor
5d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregortemplate<>
6d85cef5a54074a5f647f45c2218675f7774a909dDouglas GregorC<char>::C(int a0);
7d85cef5a54074a5f647f45c2218675f7774a909dDouglas Gregor
8220ccbf2c9ef97034cce80561f9f46c4f1f63bc7John McCallstruct S { }; // expected-note 3 {{candidate constructor (the implicit copy constructor)}}
99351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson
10a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregortemplate<typename T> void f1(T a, T b = 10) { } // expected-error{{no viable conversion}} \
11a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor// expected-note{{passing argument to parameter 'b' here}}
129351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson
139351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssontemplate<typename T> void f2(T a, T b = T()) { }
149351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson
157c2342dd4c9947806842e5aca3d2bb2e542853c9John McCalltemplate<typename T> void f3(T a, T b = T() + T()); // expected-error{{invalid operands to binary expression ('S' and 'S')}}
169351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson
179351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlssonvoid g() {
189351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson  f1(10);
197c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  f1(S()); // expected-note{{in instantiation of default function argument expression for 'f1<S>' required here}}
209351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson
219351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson  f2(10);
229351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson  f2(S());
239351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson
249351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson  f3(10);
257c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  f3(S()); // expected-note{{in instantiation of default function argument expression for 'f3<S>' required here}}
269351c173cd538f7f7c28af1494ac7e68b815b0e8Anders Carlsson}
278644aecd4383ce829d1eed81e96399904a948362Anders Carlsson
288644aecd4383ce829d1eed81e96399904a948362Anders Carlssontemplate<typename T> struct F {
29a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor  F(T t = 10); // expected-error{{no viable conversion}} \
30a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor  // expected-note{{passing argument to parameter 't' here}}
31a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor  void f(T t = 10); // expected-error{{no viable conversion}} \
32a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor  // expected-note{{passing argument to parameter 't' here}}
338644aecd4383ce829d1eed81e96399904a948362Anders Carlsson};
348644aecd4383ce829d1eed81e96399904a948362Anders Carlsson
350b84a53412a6acac38e2d647d220ce7af851395eDouglas Gregorstruct FD : F<int> { };
360b84a53412a6acac38e2d647d220ce7af851395eDouglas Gregor
378644aecd4383ce829d1eed81e96399904a948362Anders Carlssonvoid g2() {
3825cae7f4b1155b1a6ca959ea5143ea39eae656cdAnders Carlsson  F<int> f;
390b84a53412a6acac38e2d647d220ce7af851395eDouglas Gregor  FD fd;
408644aecd4383ce829d1eed81e96399904a948362Anders Carlsson}
415653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson
426bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlssonvoid g3(F<int> f, F<struct S> s) {
436bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson  f.f();
447c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  s.f(); // expected-note{{in instantiation of default function argument expression for 'f<S>' required here}}
4521e1c4ea0a96bcecfe5976304d84779949058648Anders Carlsson
4621e1c4ea0a96bcecfe5976304d84779949058648Anders Carlsson  F<int> f2;
477c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  F<S> s2; // expected-note{{in instantiation of default function argument expression for 'F<S>' required here}}
486bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson}
496bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson
505653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlssontemplate<typename T> struct G {
5125cae7f4b1155b1a6ca959ea5143ea39eae656cdAnders Carlsson  G(T) {}
525653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson};
535653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson
545653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlssonvoid s(G<int> flags = 10) { }
555653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson
566cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor// Test default arguments
576cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregortemplate<typename T>
586cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorstruct X0 {
596cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor  void f(T = T()); // expected-error{{no matching}}
606cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor};
616cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor
626cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregortemplate<typename U>
636cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid X0<U>::f(U) { }
646cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor
656cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid test_x0(X0<int> xi) {
666cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor  xi.f();
676cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor  xi.f(17);
686cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor}
695653ca5088b799ada71b5043a0a2cd71c727da83Anders Carlsson
70d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregorstruct NotDefaultConstructible { // expected-note 2{{candidate}}
71d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor  NotDefaultConstructible(int); // expected-note 2{{candidate}}
726cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor};
736bc107b49862418bf3f64f74f17e472b4c13aa71Anders Carlsson
746cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid test_x0_not_default_constructible(X0<NotDefaultConstructible> xn) {
756cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor  xn.f(NotDefaultConstructible(17));
766cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor  xn.f(42);
776cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor  xn.f(); // expected-note{{in instantiation of default function argument}}
786cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor}
79e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor
80e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregortemplate<typename T>
81e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregorstruct X1 {
82e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor  typedef T value_type;
83e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor  X1(const value_type& value = value_type());
84e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor};
85e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor
86e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregorvoid test_X1() {
87e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor  X1<int> x1;
88e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor}
890ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson
90d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregortemplate<typename T>
91d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregorstruct X2 {
92d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor  void operator()(T = T()); // expected-error{{no matching}}
93d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor};
94d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor
95d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregorvoid test_x2(X2<int> x2i, X2<NotDefaultConstructible> x2n) {
96d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor  x2i();
97d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor  x2i(17);
98d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor  x2n(NotDefaultConstructible(17));
99d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor  x2n(); // expected-note{{in instantiation of default function argument}}
100d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor}
101d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor
1020ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson// PR5283
1030ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonnamespace PR5283 {
1040ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssontemplate<typename T> struct A {
105a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor  A(T = 1); // expected-error 3 {{cannot initialize a parameter of type 'int *' with an rvalue of type 'int'}} \
106a41a8c5972c2632247ae7913cf6ce65d45f7e702Douglas Gregor  // expected-note 3{{passing argument to parameter here}}
1070ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson};
1080ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson
1090ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonstruct B : A<int*> {
1100ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson  B();
1110ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson};
1120ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders CarlssonB::B() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}}
1130ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson
1140ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonstruct C : virtual A<int*> {
1150ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson  C();
1160ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson};
1170ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders CarlssonC::C() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}}
1180ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson
1190ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlssonstruct D {
1200ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson  D();
1210ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson
1220ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson  A<int*> a;
1230ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson};
1240ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders CarlssonD::D() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}}
1250ebb6d391d2e29ed48a880517e2ba919bf7016d9Anders Carlsson}
126a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl
127a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl// PR5301
128a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redlnamespace pr5301 {
129a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  void f(int, int = 0);
130a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl
131a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  template <typename T>
132a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  void g(T, T = 0);
133a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl
134a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  template <int I>
135a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  void i(int a = I);
136a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl
137a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  template <typename T>
138a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  void h(T t) {
139a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl    f(0);
140a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl    g(1);
141a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl    g(t);
142a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl    i<2>();
143a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  }
144a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl
145a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  void test() {
146a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl    h(0);
147a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl  }
148a29e51bb9874bb9ce442efa271e87da237e4ce2cSebastian Redl}
149d47c47d65e339ab1f28e9f9365159cf1047ac1dfDouglas Gregor
15065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor// PR5810
15165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregornamespace PR5810 {
15265222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  template<typename T>
15365222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  struct allocator {
154b2b5cc0cf908d516a107d373db963f692449a8a8Chandler Carruth    allocator() { int a[sizeof(T) ? -1 : -1]; } // expected-error2 {{array with a negative size}}
15565222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  };
15665222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor
15765222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  template<typename T>
15865222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  struct vector {
159036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    vector(const allocator<T>& = allocator<T>()) {} // expected-note2 {{instantiation of}}
16065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  };
16165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor
16265222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  struct A { };
163036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  struct B { };
164036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor
16565222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  template<typename>
16665222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  void FilterVTs() {
16765222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor    vector<A> Result;
16865222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  }
16965222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor
17065222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  void f() {
17165222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor    vector<A> Result;
17265222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor  }
173036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor
174036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  template<typename T>
175036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  struct X {
176036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    vector<B> bs;
177036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    X() { }
178036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  };
179036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor
180036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  void f2() {
181036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor    X<float> x; // expected-note{{member function}}
182036aed18662e0193aafe0e8ae13d2e57efe6df25Douglas Gregor  }
18365222e82d97af2120b3952d19cbd3cd923f4b43eDouglas Gregor}
184525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregor
185525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregortemplate<typename T> void f4(T, int = 17);
186525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregortemplate<> void f4<int>(int, int);
187525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregor
188525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregorvoid f4_test(int i) {
189525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregor  f4(i);
190525f96c0ef39f91abd26b1b4584ba1814e7ebc28Douglas Gregor}
191087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor
192087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor// Instantiate for initialization
193087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregornamespace InstForInit {
194087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  template<typename T>
195087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  struct Ptr {
196087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor    typedef T* type;
197087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor    Ptr(type);
198087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  };
199087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor
200087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  template<typename T>
201087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  struct Holder {
202087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor    Holder(int i, Ptr<T> ptr = 0);
203087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  };
204087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor
205087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  void test_holder(int i) {
206087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor    Holder<int> h(i);
207087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor  }
208087fb7d0b5e08f34b2e28a09c376f66449f30886Douglas Gregor};
209be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor
210be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregornamespace PR5810b {
211be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  template<typename T>
212be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  T broken() {
213be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor    T t;
214be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor    double**** not_it = t;
215be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  }
216be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor
217be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  void f(int = broken<int>());
218be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  void g() { f(17); }
219be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor}
220be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor
2214fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregornamespace PR5810c {
2224fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  template<typename T>
2234fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  struct X {
2244fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor    X() {
2254fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor      T t;
2264fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor      double *****p = t; // expected-error{{cannot initialize a variable of type 'double *****' with an lvalue of type 'int'}}
2274fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor    }
2284fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor    X(const X&) { }
2294fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  };
2304fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor
2314fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  struct Y : X<int> { // expected-note{{instantiation of}}
2324fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  };
2334fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor
2344fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  void f(Y y = Y());
2354fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor
2364fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor  void g() { f(); }
2374fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor}
2384fcf5b2f816347ba7a3f16557d5e2b293634d4d6Douglas Gregor
239be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregornamespace PR8127 {
240be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  template< typename T > class PointerClass {
241be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  public:
242be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor    PointerClass( T * object_p ) : p_( object_p ) {
243be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor      p_->acquire();
244be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor    }
245be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  private:
246be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor    T * p_;
247be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  };
248be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor
249be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  class ExternallyImplementedClass;
250be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor
251be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  class MyClass {
252be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor    void foo( PointerClass<ExternallyImplementedClass> = 0 );
253be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor  };
254be0f7bd61c7b2879d02ae75aad7a91d92f819d94Douglas Gregor}
2555833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
2565833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregornamespace rdar8427926 {
2575833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  template<typename T>
2585833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  struct Boom {
2595833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    ~Boom() {
2605833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      T t;
2615833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor      double *******ptr = t; // expected-error 2{{cannot initialize}}
2625833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    }
2635833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  };
2645833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
2655833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  Boom<float> *bfp;
2665833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
2675833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  struct X {
2685833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    void f(Boom<int> = Boom<int>()) { } // expected-note{{requested here}}
2695833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    void g(int x = (delete bfp, 0)); // expected-note{{requested here}}
2705833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  };
2715833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor
2725833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  void test(X *x) {
2735833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    x->f();
2745833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor    x->g();
2755833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor  }
2765833b0b831d6afae2885e6af420e2bda639652e6Douglas Gregor}
277102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor
278102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregornamespace PR8401 {
279102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  template<typename T>
280102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  struct A {
281102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor    A() { T* x = 1; } // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}}
282102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  };
283102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor
284102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  template<typename T>
285102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  struct B {
286102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor    B(const A<T>& a = A<T>()); // expected-note{{in instantiation of}}
287102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  };
288102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor
289102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  void f(B<int> b = B<int>());
290102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor
291102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  void g() {
292102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor    f();
293102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor  }
294102ff97bc55ba9f925a100671d49e49b3c5f7129Douglas Gregor}
2959b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman
2969b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedmannamespace PR12581 {
2979b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  const int a = 0;
2989b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  template < typename > struct A;
2999b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  template < typename MatrixType, int =
3009b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  A < MatrixType >::Flags ? : A < MatrixType >::Flags & a > class B;
3019b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  void
3029b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  fn1 ()
3039b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  {
3049b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman  }
3059b94cd1b2527c8dc9ec19a8608f2313010e721b5Eli Friedman}
30663b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer
30763b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramernamespace PR13758 {
30863b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  template <typename T> struct move_from {
30973ed67cc36b06a380ddc3658beb7a84328c19ff6Richard Smith    T invalid;
31063b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  };
31163b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  template <class K>
31263b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  struct unordered_map {
31363b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer    explicit unordered_map(int n = 42);
31463b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer    unordered_map(move_from<K> other);
31563b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  };
31663b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  template<typename T>
31763b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  void StripedHashTable() {
31873ed67cc36b06a380ddc3658beb7a84328c19ff6Richard Smith    new unordered_map<void>();
31973ed67cc36b06a380ddc3658beb7a84328c19ff6Richard Smith    new unordered_map<void>;
32063b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  }
32163b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  void tt() {
32273ed67cc36b06a380ddc3658beb7a84328c19ff6Richard Smith    StripedHashTable<int>();
32363b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer  }
32463b6ebe4e732f20fa24ea0666ed438dd5004cc20Benjamin Kramer}
325