1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, int N> 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct A; 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T> // expected-note{{previous template declaration}} 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct A<T*, 2> { 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void f0(); 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void f1(); 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void f2(); 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct A<int, 1> { 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void g0(); 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// FIXME: We should probably give more precise diagnostics here, but the 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// diagnostics we give aren't terrible. 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// FIXME: why not point to the first parameter that's "too many"? 21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, int N> // expected-error{{too many template parameters}} 22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid A<T*, 2>::f0() { } 23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, int N> 25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid A<T, N>::f1() { } // expected-error{{out-of-line definition}} 26