// { dg-do assemble }
|
// { dg-do assemble }
|
// 980827 bkoz
|
// 980827 bkoz
|
// template parameter redeclaration bugs, part two:
|
// template parameter redeclaration bugs, part two:
|
// template template params and expanded template non-type parms
|
// template template params and expanded template non-type parms
|
|
|
// 14.1 Template parameters
|
// 14.1 Template parameters
|
// p 13
|
// p 13
|
// The scope of a template-parameter extens from its point of
|
// The scope of a template-parameter extens from its point of
|
// declartion until the end of its template. In particular, a
|
// declartion until the end of its template. In particular, a
|
// template-parameter can be used in the declaration of subsequent
|
// template-parameter can be used in the declaration of subsequent
|
// template-parameters and their default arguments.
|
// template-parameters and their default arguments.
|
|
|
// 14.6.1 Locally declared names
|
// 14.6.1 Locally declared names
|
// p 4
|
// p 4
|
// A template-parameter shall not be redeclared within its scope
|
// A template-parameter shall not be redeclared within its scope
|
// (including nested scopes). A template-parameter shall not have the
|
// (including nested scopes). A template-parameter shall not have the
|
// same name as the template name.
|
// same name as the template name.
|
|
|
// 14
|
// 14
|
// declared friend template (v3, template type parameters)
|
// declared friend template (v3, template type parameters)
|
template // { dg-error "" } .*
|
template // { dg-error "" } .*
|
class Xfourteen {
|
class Xfourteen {
|
protected:
|
protected:
|
T4 value;
|
T4 value;
|
public:
|
public:
|
Xfourteen(T4 init): value(init) {}
|
Xfourteen(T4 init): value(init) {}
|
template class T5> // { dg-error "" } .*
|
template class T5> // { dg-error "" } .*
|
friend bool isequal (Xfourteen& lhs, Xfourteen& rhs);
|
friend bool isequal (Xfourteen& lhs, Xfourteen& rhs);
|
};
|
};
|
|
|
|
|
// 15
|
// 15
|
// nested template class (v3, template type parameters)
|
// nested template class (v3, template type parameters)
|
template // { dg-error "" } .*
|
template // { dg-error "" } .*
|
class Xfifteen {
|
class Xfifteen {
|
protected:
|
protected:
|
T6 value;
|
T6 value;
|
public:
|
public:
|
Xfifteen(T6 init): value(init) {}
|
Xfifteen(T6 init): value(init) {}
|
|
|
template class T7> class nested {// { dg-error "" } .*
|
template class T7> class nested {// { dg-error "" } .*
|
int value;
|
int value;
|
public:
|
public:
|
nested(): value( int(0)) {}
|
nested(): value( int(0)) {}
|
};
|
};
|
};
|
};
|
|
|
|
|
// 16
|
// 16
|
// member templates (v3, template type parameters)
|
// member templates (v3, template type parameters)
|
template // { dg-error "" } .*
|
template // { dg-error "" } .*
|
class Xsixteen {
|
class Xsixteen {
|
protected:
|
protected:
|
T8 value;
|
T8 value;
|
public:
|
public:
|
Xsixteen(T8 init): value(init) {}
|
Xsixteen(T8 init): value(init) {}
|
|
|
template class T9> int comp_ge(int test) {// { dg-error "" } .*
|
template class T9> int comp_ge(int test) {// { dg-error "" } .*
|
int local_value;
|
int local_value;
|
if (local_value > value)
|
if (local_value > value)
|
return local_value;
|
return local_value;
|
else
|
else
|
return value;
|
return value;
|
}
|
}
|
};
|
};
|
|
|
|
|
// 17
|
// 17
|
// declared friend template (v4, template type parameters on the class)
|
// declared friend template (v4, template type parameters on the class)
|
template class tem_base {
|
template class tem_base {
|
public:
|
public:
|
T9 value;
|
T9 value;
|
};
|
};
|
|
|
template class C10>
|
template class C10>
|
class Xseventeen {
|
class Xseventeen {
|
protected:
|
protected:
|
C10 value;
|
C10 value;
|
public:
|
public:
|
Xseventeen(){}
|
Xseventeen(){}
|
template // ok??
|
template // ok??
|
friend bool isequal (Xseventeen& lhs,
|
friend bool isequal (Xseventeen& lhs,
|
Xseventeen& rhs);
|
Xseventeen& rhs);
|
};
|
};
|
|
|
//template class Xseventeen;
|
//template class Xseventeen;
|
|
|
|
|
// 18
|
// 18
|
// more template template redecl tests
|
// more template template redecl tests
|
template class C12>// { dg-error "" } .*
|
template class C12>// { dg-error "" } .*
|
class Xeighteen {
|
class Xeighteen {
|
protected:
|
protected:
|
C12 value;
|
C12 value;
|
int C12; // { dg-error "" } .*
|
int C12; // { dg-error "" } .*
|
};
|
};
|
|
|
|
|
// 19
|
// 19
|
// more template template redecl tests
|
// more template template redecl tests
|
template class C14>// { dg-error "" } .*
|
template class C14>// { dg-error "" } .*
|
class Xnineteen{
|
class Xnineteen{
|
protected:
|
protected:
|
C14 value;
|
C14 value;
|
template class nested {// { dg-error "" } .*
|
template class nested {// { dg-error "" } .*
|
T16 value;
|
T16 value;
|
public:
|
public:
|
nested(): value( T16(0)) {}
|
nested(): value( T16(0)) {}
|
};
|
};
|
};
|
};
|
|
|
|
|
// 20
|
// 20
|
// local names (14.6.1 p 4) part two, variable names as template param
|
// local names (14.6.1 p 4) part two, variable names as template param
|
template struct Xtwenty {
|
template struct Xtwenty {
|
void f(){
|
void f(){
|
T17 my_type; //ok
|
T17 my_type; //ok
|
for (int j = 0; j < 5; ++j)
|
for (int j = 0; j < 5; ++j)
|
{
|
{
|
T17 my_type; //ok
|
T17 my_type; //ok
|
++my_type;
|
++my_type;
|
}
|
}
|
}
|
}
|
};
|
};
|
|
|
|
|
// 14.1 Template parameters
|
// 14.1 Template parameters
|
// p 4
|
// p 4
|
// A non-type templat- parameter shall have one of the following
|
// A non-type templat- parameter shall have one of the following
|
// (optionally cv-qualified) types:
|
// (optionally cv-qualified) types:
|
// integral or enumeration type
|
// integral or enumeration type
|
// pointer to object or pointer to function
|
// pointer to object or pointer to function
|
// referenct to object or referece to function
|
// referenct to object or referece to function
|
// pointer to member
|
// pointer to member
|
|
|
// 21
|
// 21
|
// non-type template parameters v1: enum
|
// non-type template parameters v1: enum
|
enum my_enum {my_A = 45, my_B, my_C};
|
enum my_enum {my_A = 45, my_B, my_C};
|
|
|
template class Xtwentyone {// { dg-error "" } .*
|
template class Xtwentyone {// { dg-error "" } .*
|
float T18; // { dg-error "" } .*
|
float T18; // { dg-error "" } .*
|
};
|
};
|
|
|
|
|
// 22
|
// 22
|
// non-type template parameters v1: pointer to object
|
// non-type template parameters v1: pointer to object
|
struct base {
|
struct base {
|
int gcount;
|
int gcount;
|
int ret_gcount() {return gcount;}
|
int ret_gcount() {return gcount;}
|
};
|
};
|
|
|
template class Xtwentytwo {// { dg-error "" } .*
|
template class Xtwentytwo {// { dg-error "" } .*
|
float b; // { dg-error "" } .*
|
float b; // { dg-error "" } .*
|
};
|
};
|
|
|
|
|
// 23
|
// 23
|
// non-type template parameters v2: reference to object
|
// non-type template parameters v2: reference to object
|
template class Xtwentythree {// { dg-error "" } .*
|
template class Xtwentythree {// { dg-error "" } .*
|
float b2; // { dg-error "" } .*
|
float b2; // { dg-error "" } .*
|
};
|
};
|
|
|
|
|
// 24
|
// 24
|
// non-type template parameters v3: pointer to member
|
// non-type template parameters v3: pointer to member
|
template class Xtwentyfour {// { dg-error "" } .*
|
template class Xtwentyfour {// { dg-error "" } .*
|
float b3; // { dg-error "" } .*
|
float b3; // { dg-error "" } .*
|
};
|
};
|
|
|
|
|
// 25
|
// 25
|
// non-type template parms that use push_class_level
|
// non-type template parms that use push_class_level
|
template void f1() {// { dg-error "" } .*
|
template void f1() {// { dg-error "" } .*
|
struct foo {
|
struct foo {
|
enum T22 { un, du, toi }; // { dg-error "" } .*
|
enum T22 { un, du, toi }; // { dg-error "" } .*
|
};
|
};
|
}
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|