From ba75df2bd35a7fa872e287f752b94f2169e4370c Mon Sep 17 00:00:00 2001
From: Paolo Carlini <pcarlini@suse.de>
Date: Wed, 15 Aug 2007 09:06:42 +0000
Subject: [PATCH] re PR c++/33035 (ICE on local class destructor)

/cp
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.

/testsuite
2007-08-15  Paolo Carlini  <pcarlini@suse.de>

	PR c++/33035
	* g++.dg/template/crash68.C: New.

From-SVN: r127508
---
 gcc/cp/ChangeLog                        |  6 ++++++
 gcc/cp/pt.c                             |  4 +++-
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/g++.dg/template/crash68.C | 16 ++++++++++++++++
 4 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/template/crash68.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e632aacedc13..892e8a6ef874 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 5a0bd7170ba4..f414bc3521f4 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 8e531dee8154..eef5e699cad2 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 000000000000..9171f8c62d90
--- /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() {}
+                        };
+                }
+        };
+};
-- 
GitLab