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