From 4f4d419140e5aa6d928aec7c30d6f1347811154c Mon Sep 17 00:00:00 2001
From: tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 14 Feb 2002 17:48:36 +0000
Subject: [PATCH] 2002-02-13  Todd Stock  <toddastock@yahoo.com>

	Fix for PR libgcj/5670:
	* verify.cc (is_assignable_from_slow): If `source' is interface,
	recursively look for merge with `target'.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49769 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libjava/ChangeLog |  6 ++++++
 libjava/verify.cc | 16 ++++++++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 2438a8d75d87..9688503e8c05 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,9 @@
+2002-02-13  Todd Stock  <toddastock@yahoo.com>
+
+	Fix for PR libgcj/5670:
+	* verify.cc (is_assignable_from_slow): If `source' is interface,
+	recursively look for merge with `target'.
+
 2002-02-14  Martin Kahlert  <martin.kahlert@infineon.com>
 
 	* include/jni.h: Fix typo.
diff --git a/libjava/verify.cc b/libjava/verify.cc
index 38421f46ad63..ed734eab8f6f 100644
--- a/libjava/verify.cc
+++ b/libjava/verify.cc
@@ -259,10 +259,22 @@ private:
 	    if (source == NULL)
 	      return false;
 	  }
+	else if (source->isInterface ())
+	  {
+	    for (int i = 0; i < target->interface_count; ++i)
+	      {
+		// We use a recursive call because we also need to
+		// check superinterfaces.
+		if (is_assignable_from_slow (target->interfaces[i], source))
+		  return true;
+	      }
+	    target = target->getSuperclass ();
+	    if (target == NULL)
+	      return false;
+	  }
 	else if (target == &java::lang::Object::class$)
 	  return true;
-	else if (source->isInterface ()
-		 || source == &java::lang::Object::class$)
+	else if (source == &java::lang::Object::class$)
 	  return false;
 	else
 	  source = source->getSuperclass ();
-- 
GitLab