3 // template parameter redeclaration bugs
5 // 14.1 Template parameters
7 // The scope of a template-parameter extens from its point of
8 // declartion until the end of its template. In particular, a
9 // template-parameter can be used in the declaration of subsequent
10 // template-parameters and their default arguments.
12 // 14.6.1 Locally declared names
14 // A template-parameter shall not be redeclared within its scope
15 // (including nested scopes). A template-parameter shall not have the
16 // sname name as the template name.
20 // declared friend template
21 template <class T4>// { dg-error "" } .*
28 Xone(): next(0), prev(0), value(1999){}
29 Xone(T4 init): value(init) {}
32 // can also do template-decl and then can ditch the foward-declaration
33 // template <class T5> friend bool isequal (Xone<T5>& lhs, Xone<T5>& rhs);
35 template <class T4> friend bool isequal (Xone<T4>& lhs, Xone<T4>& rhs);// { dg-error "" } .*
40 // nested template class
41 template <class T6>// { dg-error "" } .*
48 Xtwo(): next(0), prev(0), value(1999){}
49 Xtwo(T6 init): value(init) {}
51 template <class T6> class nested {// { dg-error "" } .*
54 nested(): value( T6(0)) {}
61 template <class T8>// { dg-error "" } .*
68 Xthree(): next(0), prev(0), value(1999){}
69 Xthree(T8 init): value(init) {}
71 template <class T8> T8 comp_ge(T8 test) {// { dg-error "" } .*
73 if (local_value > value)
82 // local names (14.6.1 p 4)
83 template <class T10, int i> struct Xfour {// { dg-error "" } .*
84 int T10; // { dg-error "" } .*
92 // using different tempate-parms for out-of-line defs
93 template <class T12, int i> struct Xfive {
97 template <class T13, int i> void Xfive<T13,i>::f() {// { dg-error "" } .*
98 int T13; // { dg-error "" } .*
99 int T12; //should be ok
104 // multiple names at the same level
105 template <class T14, class T14> class Xsix { // { dg-error "" } .*
113 // multiple names, one in template parameter one in class-name
114 template <class T12> class T12; // { dg-error "" } .*
118 // with multiple template params, and second (third) one is redeclared
119 template <class T16, int i, class T161> class Xseven { // { dg-error "" } .*
121 char T161; // { dg-error "" } .*
124 friend bool fooy(U u);
126 template <class T161>
127 friend bool foo(T161 u)
129 Xseven<T161, 5, int> obj; // { dg-error "" } .*
130 return (obj.inst == u.inst); // { dg-error "" } .*
137 // check for correct scoping of member templates
148 template <class U> //ok
159 // check for non-type parameters, should still be able to redeclare?
160 // local names (14.6.1 p 4)
161 template <class T18, int i> class Xten {// { dg-error "" } .*
162 float i; // { dg-error "" } .*
167 // declared friend template, non-type parameters
168 template <long l>// { dg-error "" } .*
171 template <long l> friend bool isequal (Xeleven<5> lhs, Xeleven<5> rhs); // { dg-error "" } .*
177 // nested template class, non-type parameters
178 template <long l>// { dg-error "" } .*
181 template <long l> class nested {// { dg-error "" } .
184 nested(): value(0) {}
190 // member templates, non-type parameters
191 template <long l>// { dg-error "" } .*
193 template <long l> long comp_ge(long test) {// { dg-error "" } .
195 if (local_value > value) // { dg-error "" } .*