Index: cp/pt.c
===================================================================
--- cp/pt.c	(revision 225730)
+++ cp/pt.c	(working copy)
@@ -3661,8 +3661,13 @@ check_template_shadow (tree decl)
   if (DECL_SELF_REFERENCE_P (decl))
     return false;
 
-  error ("declaration of %q+#D", decl);
-  error (" shadows template parm %q+#D", olddecl);
+  if (DECL_TEMPLATE_PARM_P (decl))
+    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;
 }
 
Index: testsuite/g++.dg/template/crash81.C
===================================================================
--- testsuite/g++.dg/template/crash81.C	(revision 225730)
+++ testsuite/g++.dg/template/crash81.C	(working copy)
@@ -3,6 +3,6 @@
 struct A
 {
   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-error "shadows template parm 'int X'" "shadow" { target *-*-* } 5 }
+  // { dg-error "declaration of 'template<int X> struct A::X' shadows" "A::X" { target *-*-* } 5 }
+  // { dg-message "template parameter 'X'" "" { target *-*-* } 5 }
 };
Index: testsuite/g++.dg/template/pr58878.C
===================================================================
--- testsuite/g++.dg/template/pr58878.C	(revision 225730)
+++ testsuite/g++.dg/template/pr58878.C	(working copy)
@@ -3,10 +3,10 @@
 // Template-members of non-template class
 struct A
 {
-    template <typename t>    // { dg-error "shadows" }
+    template <typename t>    // { dg-message "template parameter" }
         void f()
         {
-            int t = 1;       // { dg-error "declaration" }
+            int t = 1;       // { dg-error "shadows" }
         }
 
     template <typename t>
@@ -13,39 +13,39 @@ struct A
         void g();
 };
 
-template <typename t>        // { dg-error "shadows" }
+template <typename t>        // { dg-message "template parameter" }
 void A::g()
 {
-    int t = 2;               // { dg-error "declaration" }
+    int t = 2;               // { dg-error "shadows" }
 }
 
 // (Non-template) Members of template class
-template <typename t>        // { dg-error "shadows" }
+template <typename t>        // { dg-message "template parameter" }
 struct B
 {
     void f()
     {
-        int t = 3;           // { dg-error "declaration" }
+        int t = 3;           // { dg-error "shadows" }
     }
 
     void g();
 };
 
-template <typename t>        // { dg-error "shadows" }
+template <typename t>        // { dg-message "template parameter" }
 void B<t>::g()
 {
-    int t = 4;               // { dg-error "declaration" }
+    int t = 4;               // { dg-error "shadows" }
 }
 
 // Template members of template class
-template <typename t>        // { dg-error "shadows" }
+template <typename t>        // { dg-message "template parameter" }
 struct C
 {
-    template <typename s>    // { dg-error "shadows" }
+    template <typename s>    // { dg-message "template parameter" }
     void f()
     {
-        int t = 5;           // { dg-error "declaration" }
-        int s = 6;           // { dg-error "declaration" }
+        int t = 5;           // { dg-error "shadows" }
+        int s = 6;           // { dg-error "shadows" }
     }
 
     template <typename s>
@@ -52,10 +52,10 @@ struct C
     void g();
 };
 
-template <typename t>        // { dg-error "shadows" }
-template <typename s>        // { dg-error "shadows" }
+template <typename t>        // { dg-message "template parameter" }
+template <typename s>        // { dg-message "template parameter" }
 void C<t>::g()
 {
-    int t = 7;               // { dg-error "declaration" }
-    int s = 8;               // { dg-error "declaration" }
+    int t = 7;               // { dg-error "shadows" }
+    int s = 8;               // { dg-error "shadows" }
 }
Index: testsuite/g++.dg/template/shadow1.C
===================================================================
--- testsuite/g++.dg/template/shadow1.C	(revision 225730)
+++ testsuite/g++.dg/template/shadow1.C	(working copy)
@@ -1,4 +1,4 @@
 // PR c++/58632
 
-template<template<int I> class A> // { dg-message "shadows" }
-class A {};			// { dg-error "declaration" }
+template<template<int I> class A> // { dg-message "template parameter" }
+class A {};			// { dg-error "shadows" }
Index: testsuite/g++.dg/template/shadow2.C
===================================================================
--- testsuite/g++.dg/template/shadow2.C	(revision 225730)
+++ testsuite/g++.dg/template/shadow2.C	(working copy)
@@ -1,3 +1,3 @@
-template <class A, // { dg-error "shadows template parm 'class A'" }
-          template <class A> class B> // { dg-error "declaration of 'class A'" }
+template <class A, // { dg-message "template parameter 'A'" }
+          template <class A> class B> // { dg-error "declaration of template parameter 'A' shadows" }
 class X;
Index: testsuite/g++.old-deja/g++.benjamin/tem03.C
===================================================================
--- testsuite/g++.old-deja/g++.benjamin/tem03.C	(revision 225730)
+++ testsuite/g++.old-deja/g++.benjamin/tem03.C	(working copy)
@@ -18,7 +18,7 @@
 
 // 01 
 // declared friend template
-template <class T4>// { dg-error "" } .*
+template <class T4>// { dg-message "" } .*
 class Xone {
 protected:
   T4* next;
@@ -38,7 +38,7 @@ class Xone {
 
 // 02
 // nested template class
-template <class T6>// { dg-error "" } .*
+template <class T6>// { dg-message "" } .*
 class Xtwo {
 protected:
   T6* next;
@@ -58,7 +58,7 @@ class Xtwo {
 
 // 03
 // member templates
-template <class T8>// { dg-error "" } .*
+template <class T8>// { dg-message "" } .*
 class Xthree {
 protected:
   T8* next;
@@ -80,7 +80,7 @@ class Xthree {
 
 // 04
 // 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 "" } .*
   void f(){
     char T10; // { dg-error "declaration of 'char T10'" }
@@ -94,7 +94,7 @@ template <class T12, int i> struct Xfive {
   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 T12; //should be ok
 }
@@ -116,7 +116,7 @@ template <class T12> class T12; // { dg-error "" }
 
 // 08 
 // 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:
   char T161; // { dg-error "" } .*
 public:
@@ -123,7 +123,7 @@ template <class T12> class T12; // { dg-error "" }
   template <class 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)
     {
       Xseven<T161, 5, int> obj;
@@ -158,7 +158,7 @@ struct S1
 // 10 
 // check for non-type parameters, should still be able to redeclare?
 // 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 "" } .*
 };
 
@@ -165,7 +165,7 @@ struct S1
 
 // 11 
 // declared friend template, non-type parameters
-template <long l>// { dg-error "" } .*
+template <long l>// { dg-message "" } .*
 class Xeleven {
 public:
   template <long l> friend bool isequal (Xeleven<5> lhs, Xeleven<5> rhs);  // { dg-error "" } .*
@@ -175,7 +175,7 @@ class Xeleven {
 
 // 12
 // nested template class, non-type parameters
-template <long l>// { dg-error "" } .*
+template <long l>// { dg-message "" } .*
 class Xtwelve {
 public:
   template <long l> class nested {// { dg-error "" } .
@@ -188,7 +188,7 @@ class Xtwelve {
 
 // 13
 // member templates, non-type parameters
-template <long l>// { dg-error "" } .*
+template <long l>// { dg-message "" } .*
 struct Xthirteen {
   template <long l> long comp_ge(long test) {// { dg-error "" } .
     long local_value;
Index: testsuite/g++.old-deja/g++.benjamin/tem04.C
===================================================================
--- testsuite/g++.old-deja/g++.benjamin/tem04.C	(revision 225730)
+++ testsuite/g++.old-deja/g++.benjamin/tem04.C	(working copy)
@@ -18,7 +18,7 @@
 
 // 14 
 // declared friend template (v3, template type parameters)
-template <class T4>// { dg-error "" } .*
+template <class T4>// { dg-message "" } .*
 class Xfourteen {
 protected:
   T4 value;
@@ -31,7 +31,7 @@ class Xfourteen {
 
 // 15
 // nested template class (v3, template type parameters)
-template <class T6>// { dg-error "" } .*
+template <class T6>// { dg-message "" } .*
 class Xfifteen {
 protected:
   T6 value;
@@ -48,7 +48,7 @@ class Xfifteen {
 
 // 16
 // member templates (v3, template type parameters)
-template <class T8>// { dg-error "" } .*
+template <class T8>// { dg-message "" } .*
 class Xsixteen {
 protected:
   T8 value;
@@ -88,7 +88,7 @@ class Xseventeen {
 
 // 18
 // 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 {
 protected:
   C12<T14> value;
@@ -98,7 +98,7 @@ class Xeighteen {
 
 // 19
 // 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{
 protected:
   C14<T16> value;
@@ -137,7 +137,7 @@ template <class T17, int i> struct Xtwenty {
 // non-type template parameters v1: enum
 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 "" } .*
 };
 
@@ -149,7 +149,7 @@ struct base {
   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 "" } .*
 };
 
@@ -156,7 +156,7 @@ struct base {
 
 // 23
 // 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 "" } .*
 };
 
@@ -163,7 +163,7 @@ struct base {
 
 // 24
 // 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 "" } .*
 };
 
@@ -170,13 +170,8 @@ struct base {
 
 // 25
 // 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 { 
     enum T22 { un, du, toi }; // { dg-error "" } .*
   };
 }
-
-
-
-
-
Index: testsuite/g++.old-deja/g++.brendan/crash7.C
===================================================================
--- testsuite/g++.old-deja/g++.brendan/crash7.C	(revision 225730)
+++ testsuite/g++.old-deja/g++.brendan/crash7.C	(working copy)
@@ -13,7 +13,7 @@ class Vector
   int size () { return sz; }
 };
 
-template<class T>// { dg-error "" } previous definition of T
+template<class T>// { dg-message "" } previous definition of T
 struct Comparator
 {
   typedef T T;// { dg-error "" } use of template type T in typedef to T
Index: testsuite/g++.old-deja/g++.pt/shadow2.C
===================================================================
--- testsuite/g++.old-deja/g++.pt/shadow2.C	(revision 225730)
+++ testsuite/g++.old-deja/g++.pt/shadow2.C	(working copy)
@@ -1,7 +1,7 @@
 // { dg-do assemble  }
 // 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 {
     void T(); // { dg-error "" } shadows template parameter
   };
