1 | // RUN: %clang_cc1 -std=c++11 -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 | |