1// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s
2
3// Example from the standard
4template<class T> class Array { void mf() { } };
5
6template class Array<char>;
7template void Array<int>::mf();
8template<class T> void sort(Array<T>& v) { /* ... */ }
9template void sort(Array<char>&);
10namespace N {
11  template<class T> void f(T&) { }
12}
13template void N::f<int>(int&);
14
15
16template<typename T>
17struct X0 {
18  struct Inner {};
19  void f() { }
20  static T value;
21};
22
23template<typename T>
24T X0<T>::value = 17;
25
26typedef X0<int> XInt;
27
28template struct XInt::Inner; // expected-warning{{template-id}}
29template void XInt::f(); // expected-warning{{template-id}}
30template int XInt::value; // expected-warning{{template-id}}
31
32namespace N {
33  template<typename T>
34  struct X1 { // expected-note{{explicit instantiation refers here}}
35  };
36
37  template<typename T>
38  void f1(T) {} // expected-note{{explicit instantiation refers here}}
39}
40using namespace N;
41
42template struct X1<int>; // expected-warning{{must occur in}}
43template void f1(int); // expected-warning{{must occur in}}
44