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