3 // template parameter redeclaration bugs, part two:
4 // template template params and expanded template non-type parms
6 // 14.1 Template parameters
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.
13 // 14.6.1 Locally declared names
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.
20 // declared friend template (v3, template type parameters)
21 template <class T4>// { dg-message "" } .*
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);
33 // nested template class (v3, template type parameters)
34 template <class T6>// { dg-message "" } .*
39 Xfifteen(T6 init): value(init) {}
41 template <template <typename T6> class T7> class nested {// { dg-error "" } .*
44 nested(): value( int(0)) {}
50 // member templates (v3, template type parameters)
51 template <class T8>// { dg-message "" } .*
56 Xsixteen(T8 init): value(init) {}
58 template <template <typename T8> class T9> int comp_ge(int test) {// { dg-error "" } .*
60 if (local_value > value)
69 // declared friend template (v4, template type parameters on the class)
70 template <typename T9> class tem_base {
75 template <typename T10, template <typename T12> class C10>
81 template <typename T12> // ok??
82 friend bool isequal (Xseventeen<T10, tem_base>& lhs,
83 Xseventeen<T10, tem_base>& rhs);
86 //template class Xseventeen<int, tem_base>;
90 // more template template redecl tests
91 template <typename T14, template <typename T15> class C12>// { dg-message "" } .*
95 int C12; // { dg-error "" } .*
100 // more template template redecl tests
101 template <typename T16, template <typename T17> class C14>// { dg-message "" } .*
105 template <class C14> class nested {// { dg-error "" } .*
108 nested(): value( T16(0)) {}
114 // local names (14.6.1 p 4) part two, variable names as template param
115 template <class T17, int i> struct Xtwenty {
118 for (int j = 0; j < 5; ++j)
127 // 14.1 Template parameters
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
137 // non-type template parameters v1: enum
138 enum my_enum {my_A = 45, my_B, my_C};
140 template <my_enum T18> class Xtwentyone {// { dg-message "" } .*
141 float T18; // { dg-error "" } .*
146 // non-type template parameters v1: pointer to object
149 int ret_gcount() {return gcount;}
152 template <class T20, base* b> class Xtwentytwo {// { dg-message "" } .*
153 float b; // { dg-error "" } .*
158 // non-type template parameters v2: reference to object
159 template <class T20, base& b2> class Xtwentythree {// { dg-message "" } .*
160 float b2; // { dg-error "" } .*
165 // non-type template parameters v3: pointer to member
166 template <class T20, int base::* b3> class Xtwentyfour {// { dg-message "" } .*
167 float b3; // { dg-error "" } .*
172 // non-type template parms that use push_class_level
173 template <class T22> void f1() {// { dg-message "" } .*
175 enum T22 { un, du, toi }; // { dg-error "" } .*