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