// RUN: %clang_cc1 -fsyntax-only -verify %s template struct X0 { void f(); template void g(U); struct Nested { }; static T member; }; int &use_X0_int(X0 x0i, // expected-note{{implicit instantiation first required here}} int i) { x0i.f(); // expected-note{{implicit instantiation first required here}} x0i.g(i); // expected-note{{implicit instantiation first required here}} X0::Nested nested; // expected-note{{implicit instantiation first required here}} return X0::member; // expected-note{{implicit instantiation first required here}} } template<> void X0::f() { // expected-error{{after instantiation}} } template<> template<> void X0::g(int) { // expected-error{{after instantiation}} } template<> struct X0::Nested { }; // expected-error{{after instantiation}} template<> int X0::member = 17; // expected-error{{after instantiation}} template<> struct X0 { }; // expected-error{{after instantiation}} // Example from the standard template class Array { /* ... */ }; template void sort(Array& v) { /* ... */ } struct String {}; void f(Array& v) { sort(v); // expected-note{{required}} // use primary template // sort(Array&), T is String } template<> void sort(Array& v); // // expected-error{{after instantiation}} template<> void sort<>(Array& v); // OK: sort not yet used namespace PR6160 { template void f(T); template<> void f(int); extern template void f(int); template<> void f(int) { } }