blob: 249bf9a08d5fca078f4cc6a039e01479686377f0 [file] [log] [blame]
Douglas Gregor5d290d52009-02-10 17:43:50 +00001// RUN: clang -fsyntax-only -verify %s
2
3class X;
4
5// C++ [temp.param]p4
6typedef int INT;
7enum E { enum1, enum2 };
8template<int N> struct A1;
9template<INT N, INT M> struct A2;
10template<enum E x, E y> struct A3;
11template<int &X> struct A4;
12template<int *Ptr> struct A5;
13template<int (&f)(int, int)> struct A6;
14template<int (*fp)(float, double)> struct A7;
15template<int X::*pm> struct A8;
16template<float (X::*pmf)(float, int)> struct A9;
17template<typename T, T x> struct A10;
18
19template<float f> struct A11; // expected-error{{a non-type template parameter cannot have type 'float'}}
20
21
22// C++ [temp.param]p8
23template<int X[10]> struct A5;
24template<int f(float, double)> struct A7;
25
Douglas Gregord684b002009-02-10 19:49:53 +000026// C++ [temp.param]p11:
27template<typename> struct Y1; // expected-note{{too few template parameters in template template argument}}
28template<typename, int> struct Y2;
Douglas Gregor5d290d52009-02-10 17:43:50 +000029
Douglas Gregord684b002009-02-10 19:49:53 +000030template<class T1 = int, // expected-note{{previous default template argument defined here}}
31 class T2> // expected-error{{template parameter missing a default argument}}
32 class B1;
Douglas Gregor5d290d52009-02-10 17:43:50 +000033
Douglas Gregord684b002009-02-10 19:49:53 +000034template<template<class> class = Y1, // expected-note{{previous default template argument defined here}}
35 template<class> class> // expected-error{{template parameter missing a default argument}}
36 class B1t;
37
38template<int N = 5, // expected-note{{previous default template argument defined here}}
39 int M> // expected-error{{template parameter missing a default argument}}
40 class B1n;
41
42// FIXME: spurious "shadow" warning!
43//template<template<class T> class = Y1,
44// template<class T> class>
45// class B1fixme;
46
47// C++ [temp.param]p10:
48template<class T1, class T2 = int> class B2;
49template<class T1 = int, class T2> class B2;
50
51template<template<class, int> class, template<class> class = Y1> class B2t;
52template<template<class, int> class = Y2, template<class> class> class B2t;
53
54template<int N, int M = 5> class B2n;
55template<int N = 5, int M> class B2n;
56
57// C++ [temp.param]p12:
58template<class T1,
59 class T2 = int> // expected-note{{previous default template argument defined here}}
60 class B3;
61template<class T1, typename T2> class B3;
62template<class T1,
63 typename T2 = float> // expected-error{{template parameter redefines default argument}}
64 class B3;
65
66template<template<class, int> class,
67 template<class> class = Y1> // expected-note{{previous default template argument defined here}}
68 class B3t;
69
70template<template<class, int> class, template<class> class> class B3t;
71
72template<template<class, int> class,
73 template<class> class = Y1> // expected-error{{template parameter redefines default argument}}
74 class B3t;
75
76template<int N,
77 int M = 5> // expected-note{{previous default template argument defined here}}
78 class B3n;
79
80template<int N, int M> class B3n;
81
82template<int N,
83 int M = 7> // expected-error{{template parameter redefines default argument}}
84 class B3n;
85
86// Check validity of default arguments
87template<template<class, int> class // expected-note{{previous template template parameter is here}}
88 = Y1> // expected-error{{template template argument has different template parameters than its corresponding template template parameter}}
89 class C1;