1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0 {
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void f();
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename U>
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void g(U);
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  struct Nested {
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  };
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static T member;
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint &use_X0_int(X0<int> x0i,  // expected-note{{implicit instantiation first required here}}
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao                int i) {
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  x0i.f(); // expected-note{{implicit instantiation first required here}}
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  x0i.g(i); // expected-note{{implicit instantiation first required here}}
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X0<int>::Nested nested; // expected-note{{implicit instantiation first required here}}
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  return X0<int>::member; // expected-note{{implicit instantiation first required here}}
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<>
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<int>::f() { // expected-error{{after instantiation}}
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> template<>
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<int>::g(int) { // expected-error{{after instantiation}}
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<>
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0<int>::Nested { }; // expected-error{{after instantiation}}
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<>
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint X0<int>::member = 17; // expected-error{{after instantiation}}
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<>
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0<int> { }; // expected-error{{after instantiation}}
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Example from the standard
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T> class Array { /* ... */ };
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T> void sort(Array<T>& v) { /* ... */ }
45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct String {};
47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid f(Array<String>& v) {
49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  sort(v); // expected-note{{required}}
51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           // use primary template
52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           // sort(Array<T>&), T is String
53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> void sort<String>(Array<String>& v); // // expected-error{{after instantiation}}
56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> void sort<>(Array<char*>& v);	// OK: sort<char*> not yet used
57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace PR6160 {
59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename T> void f(T);
60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<> void f(int);
61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  extern template void f(int);
62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<> void f(int) { }
63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
64