1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int I, 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<typename> class TT> 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class A; // expected-note 3 {{template is declared here}} 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename> class X; 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoA<int, 0, X> * a1; 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoA<float, 1, X, double> *a2; // expected-error{{too many template arguments for class template 'A'}} 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoA<float, 1> *a3; // expected-error{{too few template arguments for class template 'A'}} 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoA a3; // expected-error{{use of class template A requires template arguments}} 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace test0 { 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template <class t> class foo {}; 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template <class t> class bar { 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bar(::test0::foo<tee> *ptr) {} // FIXME(redundant): expected-error 2 {{use of undeclared identifier 'tee'}} 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 21