diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e632aacedc131f3e1304cf4ed19cbb96f28272cf..892e8a6ef874d931ef100d4c45b7cd031e750309 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-08-15  Paolo Carlini  <pcarlini@suse.de>
+
+	PR c++/33035
+	* pt.c (push_template_decl_real): Depending on TYPE_P
+	use either TYPE_CONTEXT or DECL_CONTEXT.
+
 2007-08-14  Mark Mitchell  <mark@codesourcery.com>
 
 	* semantics.c (finish_omp_clauses): Strip a NOP_EXPR if
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5a0bd7170ba42697397fe53b7434167e678894b8..f414bc3521f4bcdb3de66e2fcd6f15b8e1dea553 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -3913,7 +3913,9 @@ push_template_decl_real (tree decl, bool is_friend)
 	    if (current == decl)
 	      current = ctx;
 	    else
-	      current = TYPE_CONTEXT (current);
+	      current = (TYPE_P (current)
+			 ? TYPE_CONTEXT (current)
+			 : DECL_CONTEXT (current));
 	  }
     }
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8e531dee815413cc9651fdc87b3b48d44fa6c074..eef5e699cad22328ff1e173f4976e39c9386b6d2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-08-15  Paolo Carlini  <pcarlini@suse.de>
+
+	PR c++/33035
+	* g++.dg/template/crash68.C: New.
+
 2007-08-15  Maxim Kuvyrkov  <maxim@codesourcery.com>
  
 	* gcc.dg/sibcall-3.c: Remove m68k from XFAIL list.
diff --git a/gcc/testsuite/g++.dg/template/crash68.C b/gcc/testsuite/g++.dg/template/crash68.C
new file mode 100644
index 0000000000000000000000000000000000000000..9171f8c62d909d16f8784c3069bc1aa86511ec57
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/crash68.C
@@ -0,0 +1,16 @@
+// PR c++/33035
+
+template<class A> 
+struct a {
+        template<class B> 
+        struct b {
+                template<class C>
+                void f()
+                {
+                        struct g
+                        {
+                                ~g() {}
+                        };
+                }
+        };
+};