diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8f188b659b317808c4e99d44103734d607d75f5e..6f8b592cbb0e7837e1020c6c46611c79ab0709da 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
 2003-08-15  Nathan Sidwell  <nathan@codesourcery.com>
 
+	* pt.c (instantiate_class_template): Set location before
+	substuting bases.
+
 	* decl.c (make_typename_type): Use my_friendly_assert.
 	* pt.c (tsubst_aggr_type): Rearrange context substitution.
 
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 43ecde0441578189853cc7e8b6e600b01c3678ea..722c18e2a34a69b5fbc5fa410c05709e00d27ae7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5137,6 +5137,10 @@ instantiate_class_template (tree type)
       SET_CLASSTYPE_INTERFACE_UNKNOWN (type);
     }
 
+  /* Set the input location to the template definition. This is needed
+     if tsubsting causes an error.  */
+  input_location = DECL_SOURCE_LOCATION (TYPE_NAME (pattern));
+
   TYPE_HAS_CONSTRUCTOR (type) = TYPE_HAS_CONSTRUCTOR (pattern);
   TYPE_HAS_DESTRUCTOR (type) = TYPE_HAS_DESTRUCTOR (pattern);
   TYPE_HAS_NEW_OPERATOR (type) = TYPE_HAS_NEW_OPERATOR (pattern);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e491ea1944e20891f4b676e305751f1ae8b27c97..e12c2f7bd3324b77a8307d891350d373ffb0bfb7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2003-08-15  Nathan Sidwell  <nathan@codesourcery.com>
+
+	* g++.dg/template/error2.C: New test.
+	* g++.dg/lookup/using7.C: Adjust errors
+	* g++.old-deja/g++.pt/crash36.C: Likewise.
+	* g++.old-deja/g++.pt/derived3.C: Likewise.
+
 2003-08-14  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	* gcc.c-torture/execute/builtins/lib/strcat.c: New.
diff --git a/gcc/testsuite/g++.dg/lookup/using7.C b/gcc/testsuite/g++.dg/lookup/using7.C
index 5f187fef56480c01686a0f373973b783a14a8f7e..e62d3f310acf1a066f0cd944984516988e6a3ea3 100644
--- a/gcc/testsuite/g++.dg/lookup/using7.C
+++ b/gcc/testsuite/g++.dg/lookup/using7.C
@@ -4,7 +4,7 @@ template <typename T, bool=T::X> struct A
 };
 
 template <typename T> struct B : A<T>
-{
+{ // { dg-error "" }
   using A<T>::i; // { dg-error "" } 
 };
 
diff --git a/gcc/testsuite/g++.dg/template/error2.C b/gcc/testsuite/g++.dg/template/error2.C
new file mode 100644
index 0000000000000000000000000000000000000000..1ce9b6f5174ea54aa0bb9b42d7e11b01737b03bd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error2.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Aug 2003 <nathan@codesourcery.com>
+
+// instantiated from did not indicate the nested class
+
+template<class T> struct X
+{
+  T m; // { dg-error "" "" }
+};
+
+template<class T >
+struct Derived
+{
+  class Nested : public X<T>
+  { // { dg-error "instantiated"
+  };
+  
+  Nested m; // { dg-error "instantiated" "" }
+  
+  void Foo ();
+};
+
+void Foo (Derived<void> &x)
+{
+  x.Foo (); // { dg-error "instantiated" "" }
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash36.C b/gcc/testsuite/g++.old-deja/g++.pt/crash36.C
index 055df04a95f51f0cfe20f25f80cd9ce20f73de18..146c0b137832865451c8d0b10cfd5ef4770ce6bb 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/crash36.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash36.C
@@ -14,7 +14,7 @@ struct iterator {
 
 template <class Iterator>
 struct reverse_iterator : public
-iterator<typename iterator_traits<Iterator>::iterator_category> {
+iterator<typename iterator_traits<Iterator>::iterator_category> { // { dg-error "" } no type iterator_category
   protected:
   Iterator current;
   
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/derived3.C b/gcc/testsuite/g++.old-deja/g++.pt/derived3.C
index 24d2c0d720a7acec4a6bafc699ebc5b47c9ae83b..806e0f5c99c7be76f2bf8438b21e9bba7548397c 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/derived3.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/derived3.C
@@ -1,14 +1,16 @@
-// { dg-do assemble  }
+// { dg-do compile  }
 
 // by Paul Burchard <burchard@pobox.com>, Level Set Systems, Inc.
 // Copyright (C) 1999, 2002 Free Software Foundation
 
 template<class T>
 class X {
-	class Y : public T {};
-	Y y;			// { dg-error "" } invalid base type
+	class Y : public T
+	{ // { dg-error "base type .* fails to be" "" }
+	};
+	Y y;			// { dg-error "instantiated" "" }
 };
 int main() {
-	X<int> x;		// { dg-error "" } instantiated
+	X<int> x;		// { dg-error "instantiated" "" }
 }