From 0014c2479a0e42f96dba222fe391800fa8c57660 Mon Sep 17 00:00:00 2001
From: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Date: Wed, 19 Apr 2006 18:07:19 +0000
Subject: [PATCH] re PR c++/26739 (ICE in g++.old-deja/g++.pt/friend36.C)

	PR c++/26739
	* pt.c (tsubst_friend_function): Return early if
	pushdecl_namespace_level fails.

	* g++.old-deja/g++.pt/friend36.C: Adjust error markers.

From-SVN: r113090
---
 gcc/cp/ChangeLog                             | 4 ++++
 gcc/cp/pt.c                                  | 3 +++
 gcc/testsuite/ChangeLog                      | 3 +++
 gcc/testsuite/g++.old-deja/g++.pt/friend36.C | 4 ++--
 4 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index aa5b60ec0d5c..c3df66dcb329 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
 2006-04-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+	PR c++/26739
+	* pt.c (tsubst_friend_function): Return early if
+	pushdecl_namespace_level fails.
+
 	PR c++/26036
 	* typeck.c (convert_arguments): Return error_mark_node instead of
 	error_mark_list.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 83bfd1259240..fbe01dbfb418 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5230,6 +5230,9 @@ tsubst_friend_function (tree decl, tree args)
       old_decl = pushdecl_namespace_level (new_friend, /*is_friend=*/true);
       pop_nested_namespace (ns);
 
+      if (old_decl == error_mark_node)
+	return error_mark_node;
+
       if (old_decl != new_friend)
 	{
 	  /* This new friend declaration matched an existing
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0e0367b99a06..381ed85732b9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2006-04-19  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+	PR c++/26739
+	* g++.old-deja/g++.pt/friend36.C: Adjust error markers.
+
 	PR c++/26036
 	* g++.dg/expr/call3.C: New test.
 
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/friend36.C b/gcc/testsuite/g++.old-deja/g++.pt/friend36.C
index 051803b2e3db..f5cb8d40a069 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/friend36.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/friend36.C
@@ -1,12 +1,12 @@
 // { dg-do assemble  }
 
 template <class T>
-void f(T) {} // { dg-error "" } previously defined here
+void f(T) {} // { dg-error "previously" }
 
 template <class U>
 struct S {
   template <class T>
-  friend void f(T) {} // { dg-error "" } redeclaration
+  friend void f(T) {} // { dg-error "redefinition" }
 };
 
 S<int> si;
-- 
GitLab