// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++98 -Wc++11-compat %s // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s // Example from the standard template class Array { void mf() { } }; template class Array; template void Array::mf(); template void sort(Array& v) { /* ... */ } template void sort(Array&); namespace N { template void f(T&) { } } template void N::f(int&); template struct X0 { struct Inner {}; void f() { } static T value; }; template T X0::value = 17; typedef X0 XInt; template struct XInt::Inner; // expected-warning{{template-id}} template void XInt::f(); // expected-warning{{template-id}} template int XInt::value; // expected-warning{{template-id}} namespace N { template struct X1 { // expected-note{{explicit instantiation refers here}} }; template void f1(T) {} // expected-note{{explicit instantiation refers here}} } using namespace N; template struct X1; #if __cplusplus <= 199711L // expected-warning@-2 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}} #else // expected-error@-4 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}} #endif template void f1(int); #if __cplusplus <= 199711L // expected-warning@-2 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}} #else // expected-error@-4 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}} #endif