From c9043d037246a4de7b42f411ac628971d50ea145 Mon Sep 17 00:00:00 2001
From: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Date: Thu, 19 Jan 2006 17:29:42 +0000
Subject: [PATCH] re PR c++/25854 (Bogus diagnostic with '<type error>')

	PR c++/25854
	* pt.c (maybe_process_partial_specialization): Return early on
	error_mark_node.

	* g++.dg/template/spec28.C: New test.

From-SVN: r109975
---
 gcc/cp/ChangeLog                       | 6 ++++++
 gcc/cp/pt.c                            | 8 ++++++--
 gcc/testsuite/ChangeLog                | 5 +++++
 gcc/testsuite/g++.dg/template/spec28.C | 6 ++++++
 4 files changed, 23 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/spec28.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 981976f2821b..53b2953320a7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2006-01-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+	PR c++/25854
+	* pt.c (maybe_process_partial_specialization): Return early on
+	error_mark_node.
+
 2006-01-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 	PR c++/16829
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 23c84cde0daa..236145763add 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -678,8 +678,12 @@ check_explicit_instantiation_namespace (tree spec)
 void
 maybe_process_partial_specialization (tree type)
 {
-  /* TYPE maybe an ERROR_MARK_NODE.  */
-  tree context = TYPE_P (type) ? TYPE_CONTEXT (type) : NULL_TREE;
+  tree context;
+
+  if (type == error_mark_node)
+    return;
+
+  context = TYPE_CONTEXT (type);
 
   if (CLASS_TYPE_P (type) && CLASSTYPE_USE_TEMPLATE (type))
     {
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f39f40f89ad1..4e4c7e0c6839 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+	PR c++/25854
+	* g++.dg/template/spec28.C: New test.
+
 2006-01-19  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	* objc.dg/gnu-encoding/struct-layout-encoding-1_generate.c (switchfiles):
diff --git a/gcc/testsuite/g++.dg/template/spec28.C b/gcc/testsuite/g++.dg/template/spec28.C
new file mode 100644
index 000000000000..f0bb22caeb40
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec28.C
@@ -0,0 +1,6 @@
+// PR c++/25854
+// Bad diagnostic
+// { dg-do compile }
+
+template<typename> struct A {};  // { dg-error "provided" }
+template<> struct A<> {};        // { dg-error "wrong number" }
-- 
GitLab