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