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