1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U> // expected-note{{previous template}}
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass X0 {
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic:
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  typedef int size_type;
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X0(int);
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  ~X0();
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void f0(const T&, const U&);
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  T& operator[](int i) const;
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void f1(size_type) const;
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void f2(size_type) const;
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void f3(size_type) const;
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void f4() ;
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  operator T*() const;
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  T value;
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<T, U>::f0(const T&, const U&) { // expected-note{{previous definition}}
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class X, class Y>
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoX& X0<X, Y>::operator[](int i) const {
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  (void)i;
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  return value;
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class X, class Y>
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<X, Y>::f1(int) const { }
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class X, class Y>
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<X, Y>::f2(size_type) const { }
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class X, class Y, class Z> // expected-error{{too many template parameters}}
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<X, Y>::f3(size_type) const {
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class X, class Y>
45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<Y, X>::f4() { } // expected-error{{does not refer}}
46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// FIXME: error message should probably say, "redefinition of 'X0<T, U>::f0'"
48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// rather than just "redefinition of 'f0'"
49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X0<T, U>::f0(const T&, const U&) { // expected-error{{redefinition}}
51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Test out-of-line constructors, destructors
54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoX0<T, U>::X0(int x) : value(x) { }
56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoX0<T, U>::~X0() { }
59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Test out-of-line conversion functions.
61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, typename U>
62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoX0<T, U>::operator T*() const {
63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  return &value;
64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace N { template <class X> class A {void a();}; }
67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace N { template <class X> void A<X>::a() {} }
68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// PR5566
70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X1 {
72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename U>
73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  struct B { void f(); };
74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename U>
78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X1<T>::template B<U>::f() { }
79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// PR5527
81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <template <class> class T>
82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass X2 {
83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template <class F>
84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class Bar {
85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    void Func();
86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  };
87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <template <class> class T>
90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <class F>
91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X2<T>::Bar<F>::Func() {}
92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// PR5528
94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <template <class> class T>
95ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass X3 {
96ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void F();
97ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
98ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
99ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <template <class> class T>
100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid X3<T>::F() {}
101