1// { dg-do assemble  }
2// 980827 bkoz
3// template parameter redeclaration bugs, part two:
4// template template params and expanded template non-type parms
5
6// 14.1 Template parameters
7// p 13
8// The scope of a template-parameter extens from its point of
9// declartion until the end of its template. In particular, a
10// template-parameter can be used in the declaration of subsequent
11// template-parameters and their default arguments.
12
13// 14.6.1 Locally declared names
14// p 4
15// A template-parameter shall not be redeclared within its scope
16// (including nested scopes). A template-parameter shall not have the
17// same name as the template name.
18
19// 14
20// declared friend template (v3, template type parameters)
21template <class T4>// { dg-error "" } .*
22class Xfourteen {
23protected:
24  T4 value;
25public:
26  Xfourteen(T4 init): value(init) {}
27  template <template <typename T4> class T5> // { dg-error "" } .*
28  friend bool isequal (Xfourteen<int>& lhs, Xfourteen<int>& rhs);
29};
30
31
32// 15
33// nested template class (v3, template type parameters)
34template <class T6>// { dg-error "" } .*
35class Xfifteen {
36protected:
37  T6 value;
38public:
39  Xfifteen(T6 init): value(init) {}
40
41  template <template <typename T6> class T7> class nested {// { dg-error "" } .*
42    int value;
43  public:
44    nested(): value( int(0)) {}
45  };
46};
47
48
49// 16
50// member templates (v3, template type parameters)
51template <class T8>// { dg-error "" } .*
52class Xsixteen {
53protected:
54  T8 value;
55public:
56  Xsixteen(T8 init): value(init) {}
57
58  template <template <typename T8> class T9> int comp_ge(int test) {// { dg-error "" } .*
59    int local_value;
60    if (local_value > value)
61      return local_value;
62    else
63      return value;
64  }
65};
66
67
68// 17
69// declared friend template (v4, template type parameters on the class)
70template <typename T9> class tem_base {
71public:
72  T9 value;
73};
74
75template <typename T10, template <typename T12> class C10>
76class Xseventeen {
77protected:
78  C10<T10> value;
79public:
80  Xseventeen(){}
81  template <typename T12> // ok??
82  friend bool isequal (Xseventeen<T10, tem_base>& lhs,
83		       Xseventeen<T10, tem_base>& rhs);
84};
85
86//template class Xseventeen<int, tem_base>;
87
88
89// 18
90// more template template redecl tests
91template <typename T14, template <typename T15> class C12>// { dg-error "" } .*
92class Xeighteen {
93protected:
94  C12<T14> value; // { dg-error "" }
95  int C12; // { dg-error "" } .*
96};
97
98
99// 19
100// more template template redecl tests
101template <typename T16, template <typename T17> class C14>// { dg-error "" } .*
102class Xnineteen{
103protected:
104  C14<T16> value;
105  template <class C14> class nested {// { dg-error "" } .*
106    T16 value;
107  public:
108    nested(): value( T16(0)) {}
109  };
110};
111
112
113// 20
114// local names (14.6.1 p 4) part two, variable names as template param
115template <class T17, int i> struct Xtwenty {
116  void f(){
117    T17 my_type; //ok
118    for (int j = 0; j < 5; ++j)
119      {
120	T17 my_type; //ok
121	++my_type;
122      }
123  }
124};
125
126
127// 14.1 Template parameters
128// p 4
129// A non-type templat- parameter shall have one of the following
130// (optionally cv-qualified) types:
131//   integral or enumeration type
132//   pointer to object or pointer to function
133//   referenct to object or referece to function
134//   pointer to member
135
136// 21
137// non-type template parameters v1: enum
138enum my_enum {my_A = 45, my_B, my_C};
139
140template <my_enum T18> class Xtwentyone {// { dg-error "" } .*
141  float T18; // { dg-error "" } .*
142};
143
144
145// 22
146// non-type template parameters v1: pointer to object
147struct base {
148  int	gcount;
149  int ret_gcount() {return gcount;}
150};
151
152template <class T20, base* b> class Xtwentytwo {// { dg-error "" } .*
153  float b; // { dg-error "" } .*
154};
155
156
157// 23
158// non-type template parameters v2: reference to object
159template <class T20, base& b2> class Xtwentythree {// { dg-error "" } .*
160  float b2; // { dg-error "" } .*
161};
162
163
164// 24
165// non-type template parameters v3: pointer to member
166template <class T20, int base::* b3> class Xtwentyfour {// { dg-error "" } .*
167  float b3; // { dg-error "" } .*
168};
169
170
171// 25
172// non-type template parms that use push_class_level
173template <class T22> void f1() {// { dg-error "" } .*
174  struct foo {
175    enum T22 { un, du, toi }; // { dg-error "" } .*
176  };
177}
178
179
180
181
182
183