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