1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename> struct Y1; // expected-note{{too few template parameters in template template argument}}
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename, int> struct Y2;
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// C++ [temp.param]p12:
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T1,
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao         class T2 = int> // expected-note{{previous default template argument defined here}}
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class B3;
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T1, typename T2> class B3;
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<class T1,
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao         typename T2 = float> // expected-error{{template parameter redefines default argument}}
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class B3;
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<template<class, int> class,
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao         template<class> class = Y1> // expected-note{{previous default template argument defined here}}
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class B3t;
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<template<class, int> class, template<class> class> class B3t;
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<template<class, int> class,
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao         template<class> class = Y1> // expected-error{{template parameter redefines default argument}}
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class B3t;
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int N,
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao         int M = 5> // expected-note{{previous default template argument defined here}}
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class B3n;
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int N, int M> class B3n;
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int N,
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao         int M = 7>  // expected-error{{template parameter redefines default argument}}
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class B3n;
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Check validity of default arguments
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<template<class, int> class // expected-note{{previous template template parameter is here}}
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao           = Y1> // expected-error{{template template argument has different template parameters than its corresponding template template parameter}}
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  class C1 {};
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei LiaoC1<> c1; // expected-note{{while checking a default template argument}}
40