| // 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 T> class Array { void mf() { } }; |
| |
| template class Array<char>; |
| template void Array<int>::mf(); |
| template<class T> void sort(Array<T>& v) { /* ... */ } |
| template void sort(Array<char>&); |
| namespace N { |
| template<class T> void f(T&) { } |
| } |
| template void N::f<int>(int&); |
| |
| |
| template<typename T> |
| struct X0 { |
| struct Inner {}; |
| void f() { } |
| static T value; |
| }; |
| |
| template<typename T> |
| T X0<T>::value = 17; |
| |
| typedef X0<int> 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<typename T> |
| struct X1 { // expected-note{{explicit instantiation refers here}} |
| }; |
| |
| template<typename T> |
| void f1(T) {} // expected-note{{explicit instantiation refers here}} |
| } |
| using namespace N; |
| |
| template struct X1<int>; |
| #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 |