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