1 // RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s 2 3 template <class T> struct eval; // expected-note 3{{template is declared here}} 4 5 template <template <class, class...> class TT, class T1, class... Rest> 6 struct eval<TT<T1, Rest...>> { }; 7 8 template <class T1> struct A; 9 template <class T1, class T2> struct B; 10 template <int N> struct C; 11 template <class T1, int N> struct D; 12 template <class T1, class T2, int N = 17> struct E; 13 14 eval<A<int>> eA; 15 eval<B<int, float>> eB; 16 eval<C<17>> eC; // expected-error{{implicit instantiation of undefined template 'eval<C<17> >'}} 17 eval<D<int, 17>> eD; // expected-error{{implicit instantiation of undefined template 'eval<D<int, 17> >'}} 18 eval<E<int, float>> eE; // expected-error{{implicit instantiation of undefined template 'eval<E<int, float, 17> >}} 19 20 template<template <int ...N> class TT> struct X0 { }; // expected-note{{previous non-type template parameter with type 'int' is here}} 21 template<int I, int J, int ...Rest> struct X0a; 22 template<int ...Rest> struct X0b; 23 template<int I, long J> struct X0c; // expected-note{{template non-type parameter has a different type 'long' in template argument}} 24 25 X0<X0a> inst_x0a; 26 X0<X0b> inst_x0b; 27 X0<X0c> inst_x0c; // expected-error{{template template argument has different template parameters than its corresponding template template parameter}} 28 29 template<typename T, 30 template <T ...N> class TT> // expected-note{{previous non-type template parameter with type 'short' is here}} 31 struct X1 { }; 32 template<int I, int J, int ...Rest> struct X1a; 33 template<long I, long ...Rest> struct X1b; 34 template<short I, short J> struct X1c; 35 template<short I, long J> struct X1d; // expected-note{{template non-type parameter has a different type 'long' in template argument}} 36 37 X1<int, X1a> inst_x1a; 38 X1<long, X1b> inst_x1b; 39 X1<short, X1c> inst_x1c; 40 X1<short, X1d> inst_x1d; // expected-error{{template template argument has different template parameters than its corresponding template template paramete}} 41