Commit 87679b76 by Paolo Carlini Committed by Paolo Carlini

pt.c (check_template_shadow): Emit error + inform instead of two errors.

/cp
2015-07-14  Paolo Carlini  <paolo.carlini@oracle.com>

	* pt.c (check_template_shadow): Emit error + inform instead of
	two errors.

/testsuite
2015-07-14  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/template/crash81.C: Adjust for error + inform change.
	* g++.dg/template/pr58878.C: Likewise.
	* g++.dg/template/shadow1.C: Likewise.
	* g++.dg/template/shadow2.C: Likewise.
	* g++.old-deja/g++.benjamin/tem03.C: Likewise.
	* g++.old-deja/g++.benjamin/tem04.C: Likewise.
	* g++.old-deja/g++.brendan/crash7.C: Likewise.
	* g++.old-deja/g++.pt/shadow2.C: Likewise.

From-SVN: r225783
parent 721c8251
2015-07-14 Paolo Carlini <paolo.carlini@oracle.com>
* pt.c (check_template_shadow): Emit error + inform instead of
two errors.
2015-07-13 Patrick Palka <ppalka@gcc.gnu.org> 2015-07-13 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/65186 PR c++/65186
......
...@@ -3661,8 +3661,13 @@ check_template_shadow (tree decl) ...@@ -3661,8 +3661,13 @@ check_template_shadow (tree decl)
if (DECL_SELF_REFERENCE_P (decl)) if (DECL_SELF_REFERENCE_P (decl))
return false; return false;
error ("declaration of %q+#D", decl); if (DECL_TEMPLATE_PARM_P (decl))
error (" shadows template parm %q+#D", olddecl); error ("declaration of template parameter %q+D shadows "
"template parameter", decl);
else
error ("declaration of %q+#D shadows template parameter", decl);
inform (DECL_SOURCE_LOCATION (olddecl),
"template parameter %qD declared here", olddecl);
return false; return false;
} }
......
2015-07-14 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/template/crash81.C: Adjust for error + inform change.
* g++.dg/template/pr58878.C: Likewise.
* g++.dg/template/shadow1.C: Likewise.
* g++.dg/template/shadow2.C: Likewise.
* g++.old-deja/g++.benjamin/tem03.C: Likewise.
* g++.old-deja/g++.benjamin/tem04.C: Likewise.
* g++.old-deja/g++.brendan/crash7.C: Likewise.
* g++.old-deja/g++.pt/shadow2.C: Likewise.
2015-07-14 Richard Biener <rguenther@suse.de> 2015-07-14 Richard Biener <rguenther@suse.de>
PR tree-optimization/66863 PR tree-optimization/66863
......
...@@ -3,6 +3,5 @@ ...@@ -3,6 +3,5 @@
struct A struct A
{ {
template<T::X> struct X; // { dg-error "'T' has not been declared" "T" } template<T::X> struct X; // { dg-error "'T' has not been declared" "T" }
// { dg-error "declaration of 'template<int X> struct A::X'" "A::X" { target *-*-* } 5 } // { dg-bogus "declaration" "" { xfail *-*-* } 5 }
// { dg-error "shadows template parm 'int X'" "shadow" { target *-*-* } 5 }
}; };
...@@ -3,59 +3,59 @@ ...@@ -3,59 +3,59 @@
// Template-members of non-template class // Template-members of non-template class
struct A struct A
{ {
template <typename t> // { dg-error "shadows" } template <typename t> // { dg-message "template parameter" }
void f() void f()
{ {
int t = 1; // { dg-error "declaration" } int t = 1; // { dg-error "shadows" }
} }
template <typename t> template <typename t>
void g(); void g();
}; };
template <typename t> // { dg-error "shadows" } template <typename t> // { dg-message "template parameter" }
void A::g() void A::g()
{ {
int t = 2; // { dg-error "declaration" } int t = 2; // { dg-error "shadows" }
} }
// (Non-template) Members of template class // (Non-template) Members of template class
template <typename t> // { dg-error "shadows" } template <typename t> // { dg-message "template parameter" }
struct B struct B
{ {
void f() void f()
{ {
int t = 3; // { dg-error "declaration" } int t = 3; // { dg-error "shadows" }
} }
void g(); void g();
}; };
template <typename t> // { dg-error "shadows" } template <typename t> // { dg-message "template parameter" }
void B<t>::g() void B<t>::g()
{ {
int t = 4; // { dg-error "declaration" } int t = 4; // { dg-error "shadows" }
} }
// Template members of template class // Template members of template class
template <typename t> // { dg-error "shadows" } template <typename t> // { dg-message "template parameter" }
struct C struct C
{ {
template <typename s> // { dg-error "shadows" } template <typename s> // { dg-message "template parameter" }
void f() void f()
{ {
int t = 5; // { dg-error "declaration" } int t = 5; // { dg-error "shadows" }
int s = 6; // { dg-error "declaration" } int s = 6; // { dg-error "shadows" }
} }
template <typename s> template <typename s>
void g(); void g();
}; };
template <typename t> // { dg-error "shadows" } template <typename t> // { dg-message "template parameter" }
template <typename s> // { dg-error "shadows" } template <typename s> // { dg-message "template parameter" }
void C<t>::g() void C<t>::g()
{ {
int t = 7; // { dg-error "declaration" } int t = 7; // { dg-error "shadows" }
int s = 8; // { dg-error "declaration" } int s = 8; // { dg-error "shadows" }
} }
// PR c++/58632 // PR c++/58632
template<template<int I> class A> // { dg-message "shadows" } template<template<int I> class A> // { dg-message "template parameter" }
class A {}; // { dg-error "declaration" } class A {}; // { dg-error "shadows" }
template <class A, // { dg-error "shadows template parm 'class A'" } template <class A, // { dg-message "template parameter 'A'" }
template <class A> class B> // { dg-error "declaration of 'class A'" } template <class A> class B> // { dg-error "declaration of template parameter 'A' shadows" }
class X; class X;
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// 01 // 01
// declared friend template // declared friend template
template <class T4>// { dg-error "" } .* template <class T4>// { dg-message "" } .*
class Xone { class Xone {
protected: protected:
T4* next; T4* next;
...@@ -38,7 +38,7 @@ public: ...@@ -38,7 +38,7 @@ public:
// 02 // 02
// nested template class // nested template class
template <class T6>// { dg-error "" } .* template <class T6>// { dg-message "" } .*
class Xtwo { class Xtwo {
protected: protected:
T6* next; T6* next;
...@@ -58,7 +58,7 @@ public: ...@@ -58,7 +58,7 @@ public:
// 03 // 03
// member templates // member templates
template <class T8>// { dg-error "" } .* template <class T8>// { dg-message "" } .*
class Xthree { class Xthree {
protected: protected:
T8* next; T8* next;
...@@ -80,7 +80,7 @@ public: ...@@ -80,7 +80,7 @@ public:
// 04 // 04
// local names (14.6.1 p 4) // local names (14.6.1 p 4)
template <class T10, int i> struct Xfour {// { dg-error "" } .* template <class T10, int i> struct Xfour {// { dg-message "" } .*
int T10; // { dg-error "" } .* int T10; // { dg-error "" } .*
void f(){ void f(){
char T10; // { dg-error "declaration of 'char T10'" } char T10; // { dg-error "declaration of 'char T10'" }
...@@ -94,7 +94,7 @@ template <class T12, int i> struct Xfive { ...@@ -94,7 +94,7 @@ template <class T12, int i> struct Xfive {
void f(); void f();
}; };
template <class T13, int i> void Xfive<T13,i>::f() {// { dg-error "" } .* template <class T13, int i> void Xfive<T13,i>::f() {// { dg-message "" } .*
int T13; // { dg-error "" } .* int T13; // { dg-error "" } .*
int T12; //should be ok int T12; //should be ok
} }
...@@ -116,14 +116,14 @@ template <class T12> class T12; // { dg-error "" } .* ...@@ -116,14 +116,14 @@ template <class T12> class T12; // { dg-error "" } .*
// 08 // 08
// with multiple template params, and second (third) one is redeclared // with multiple template params, and second (third) one is redeclared
template <class T16, int i, class T161> class Xseven { // { dg-error "" } .* template <class T16, int i, class T161> class Xseven { // { dg-message "" } .*
private: private:
char T161; // { dg-error "" } .* char T161; // { dg-error "" } .*
public: public:
template <class U> template <class U>
friend bool fooy(U u); friend bool fooy(U u);
template <class T161> // { dg-error "declaration of 'class T161'" } template <class T161> // { dg-error "declaration of template parameter 'T161'" }
friend bool foo(T161 u) friend bool foo(T161 u)
{ {
Xseven<T161, 5, int> obj; Xseven<T161, 5, int> obj;
...@@ -158,14 +158,14 @@ struct S1 ...@@ -158,14 +158,14 @@ struct S1
// 10 // 10
// check for non-type parameters, should still be able to redeclare? // check for non-type parameters, should still be able to redeclare?
// local names (14.6.1 p 4) // local names (14.6.1 p 4)
template <class T18, int i> class Xten {// { dg-error "" } .* template <class T18, int i> class Xten {// { dg-message "" } .*
float i; // { dg-error "" } .* float i; // { dg-error "" } .*
}; };
// 11 // 11
// declared friend template, non-type parameters // declared friend template, non-type parameters
template <long l>// { dg-error "" } .* template <long l>// { dg-message "" } .*
class Xeleven { class Xeleven {
public: public:
template <long l> friend bool isequal (Xeleven<5> lhs, Xeleven<5> rhs); // { dg-error "" } .* template <long l> friend bool isequal (Xeleven<5> lhs, Xeleven<5> rhs); // { dg-error "" } .*
...@@ -175,7 +175,7 @@ public: ...@@ -175,7 +175,7 @@ public:
// 12 // 12
// nested template class, non-type parameters // nested template class, non-type parameters
template <long l>// { dg-error "" } .* template <long l>// { dg-message "" } .*
class Xtwelve { class Xtwelve {
public: public:
template <long l> class nested {// { dg-error "" } . template <long l> class nested {// { dg-error "" } .
...@@ -188,7 +188,7 @@ public: ...@@ -188,7 +188,7 @@ public:
// 13 // 13
// member templates, non-type parameters // member templates, non-type parameters
template <long l>// { dg-error "" } .* template <long l>// { dg-message "" } .*
struct Xthirteen { struct Xthirteen {
template <long l> long comp_ge(long test) {// { dg-error "" } . template <long l> long comp_ge(long test) {// { dg-error "" } .
long local_value; long local_value;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// 14 // 14
// declared friend template (v3, template type parameters) // declared friend template (v3, template type parameters)
template <class T4>// { dg-error "" } .* template <class T4>// { dg-message "" } .*
class Xfourteen { class Xfourteen {
protected: protected:
T4 value; T4 value;
...@@ -31,7 +31,7 @@ public: ...@@ -31,7 +31,7 @@ public:
// 15 // 15
// nested template class (v3, template type parameters) // nested template class (v3, template type parameters)
template <class T6>// { dg-error "" } .* template <class T6>// { dg-message "" } .*
class Xfifteen { class Xfifteen {
protected: protected:
T6 value; T6 value;
...@@ -48,7 +48,7 @@ public: ...@@ -48,7 +48,7 @@ public:
// 16 // 16
// member templates (v3, template type parameters) // member templates (v3, template type parameters)
template <class T8>// { dg-error "" } .* template <class T8>// { dg-message "" } .*
class Xsixteen { class Xsixteen {
protected: protected:
T8 value; T8 value;
...@@ -88,7 +88,7 @@ public: ...@@ -88,7 +88,7 @@ public:
// 18 // 18
// more template template redecl tests // more template template redecl tests
template <typename T14, template <typename T15> class C12>// { dg-error "" } .* template <typename T14, template <typename T15> class C12>// { dg-message "" } .*
class Xeighteen { class Xeighteen {
protected: protected:
C12<T14> value; C12<T14> value;
...@@ -98,7 +98,7 @@ protected: ...@@ -98,7 +98,7 @@ protected:
// 19 // 19
// more template template redecl tests // more template template redecl tests
template <typename T16, template <typename T17> class C14>// { dg-error "" } .* template <typename T16, template <typename T17> class C14>// { dg-message "" } .*
class Xnineteen{ class Xnineteen{
protected: protected:
C14<T16> value; C14<T16> value;
...@@ -137,7 +137,7 @@ template <class T17, int i> struct Xtwenty { ...@@ -137,7 +137,7 @@ template <class T17, int i> struct Xtwenty {
// 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 <my_enum T18> class Xtwentyone {// { dg-error "" } .* template <my_enum T18> class Xtwentyone {// { dg-message "" } .*
float T18; // { dg-error "" } .* float T18; // { dg-error "" } .*
}; };
...@@ -149,34 +149,29 @@ struct base { ...@@ -149,34 +149,29 @@ struct base {
int ret_gcount() {return gcount;} int ret_gcount() {return gcount;}
}; };
template <class T20, base* b> class Xtwentytwo {// { dg-error "" } .* template <class T20, base* b> class Xtwentytwo {// { dg-message "" } .*
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 T20, base& b2> class Xtwentythree {// { dg-error "" } .* template <class T20, base& b2> class Xtwentythree {// { dg-message "" } .*
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 T20, int base::* b3> class Xtwentyfour {// { dg-error "" } .* template <class T20, int base::* b3> class Xtwentyfour {// { dg-message "" } .*
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 <class T22> void f1() {// { dg-error "" } .* template <class T22> void f1() {// { dg-message "" } .*
struct foo { struct foo {
enum T22 { un, du, toi }; // { dg-error "" } .* enum T22 { un, du, toi }; // { dg-error "" } .*
}; };
} }
...@@ -13,7 +13,7 @@ public: ...@@ -13,7 +13,7 @@ public:
int size () { return sz; } int size () { return sz; }
}; };
template<class T>// { dg-error "" } previous definition of T template<class T>// { dg-message "" } previous definition of T
struct Comparator struct Comparator
{ {
typedef T T;// { dg-error "" } use of template type T in typedef to T typedef T T;// { dg-error "" } use of template type T in typedef to T
......
// { dg-do assemble } // { dg-do assemble }
// Origin: Jason Merrill <jason@cygnus.com> // Origin: Jason Merrill <jason@cygnus.com>
template <class T> struct A { // { dg-error "" } shadowed parameter template <class T> struct A { // { dg-message "" } shadowed parameter
struct B { struct B {
void T(); // { dg-error "" } shadows template parameter void T(); // { dg-error "" } shadows template parameter
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment