1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T> 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0 { 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void f(); 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<typename U> 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void g(U); 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao struct Nested { 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static T member; 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint &use_X0_int(X0<int> x0i, // expected-note{{implicit instantiation first required here}} 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int i) { 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x0i.f(); // expected-note{{implicit instantiation first required here}} 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao x0i.g(i); // expected-note{{implicit instantiation first required here}} 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X0<int>::Nested nested; // expected-note{{implicit instantiation first required here}} 21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return X0<int>::member; // expected-note{{implicit instantiation first required here}} 22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> 25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<int>::f() { // expected-error{{after instantiation}} 26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> template<> 29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<int>::g(int) { // expected-error{{after instantiation}} 30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> 33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0<int>::Nested { }; // expected-error{{after instantiation}} 34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> 36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint X0<int>::member = 17; // expected-error{{after instantiation}} 37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> 39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0<int> { }; // expected-error{{after instantiation}} 40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Example from the standard 42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T> class Array { /* ... */ }; 43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T> void sort(Array<T>& v) { /* ... */ } 45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct String {}; 47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid f(Array<String>& v) { 49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao sort(v); // expected-note{{required}} 51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // use primary template 52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // sort(Array<T>&), T is String 53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> void sort<String>(Array<String>& v); // // expected-error{{after instantiation}} 56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> void sort<>(Array<char*>& v); // OK: sort<char*> not yet used 57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace PR6160 { 59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<typename T> void f(T); 60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<> void f(int); 61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao extern template void f(int); 62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<> void f(int) { } 63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 64