1 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++98 -Wc++11-compat %s
3 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s
4
5 // Example from the standard
mf()6 template<class T> class Array { void mf() { } };
7
8 template class Array<char>;
9 template void Array<int>::mf();
sort(Array<T> & v)10 template<class T> void sort(Array<T>& v) { /* ... */ }
11 template void sort(Array<char>&);
12 namespace N {
f(T &)13 template<class T> void f(T&) { }
14 }
15 template void N::f<int>(int&);
16
17
18 template<typename T>
19 struct X0 {
20 struct Inner {};
fX021 void f() { }
22 static T value;
23 };
24
25 template<typename T>
26 T X0<T>::value = 17;
27
28 typedef X0<int> XInt;
29
30 template struct XInt::Inner; // expected-warning{{template-id}}
31 template void XInt::f(); // expected-warning{{template-id}}
32 template int XInt::value; // expected-warning{{template-id}}
33
34 namespace N {
35 template<typename T>
36 struct X1 { // expected-note{{explicit instantiation refers here}}
37 };
38
39 template<typename T>
f1(T)40 void f1(T) {} // expected-note{{explicit instantiation refers here}}
41 }
42 using namespace N;
43
44 template struct X1<int>;
45 #if __cplusplus <= 199711L
46 // expected-warning@-2 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}}
47 #else
48 // expected-error@-4 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}}
49 #endif
50
51 template void f1(int);
52 #if __cplusplus <= 199711L
53 // expected-warning@-2 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}}
54 #else
55 // expected-error@-4 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}}
56 #endif
57