Index: /trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h	(revision 446)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h	(revision 447)
@@ -153,4 +153,5 @@
 
 	bool Equals( const Type &type ) const;
+	bool IsCovariant( const Type &type ) const;
 
 	int GetBasicSize() const;
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp	(revision 446)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp	(revision 447)
@@ -130,12 +130,12 @@
 
 //自身の派生クラスかどうかを確認
-bool CClass::IsSubClass( const CClass *pClass ) const
-{
-	if( !pClass->HasSuperClass() )
+bool CClass::IsSubClass( const CClass *pSubClass ) const
+{
+	if( !pSubClass->HasSuperClass() )
 	{
 		return false;
 	}
 
-	const CClass *pTempClass = &pClass->GetSuperClass();
+	const CClass *pTempClass = &pSubClass->GetSuperClass();
 	while( pTempClass ){
 		if( this == pTempClass ) return true;
@@ -146,8 +146,8 @@
 
 //自身と等しいまたは派生クラスかどうかを確認
-bool CClass::IsEqualsOrSubClass( const CClass *pClass ) const
-{
-	if( IsEquals( pClass ) ) return true;
-	return IsSubClass( pClass );
+bool CClass::IsEqualsOrSubClass( const CClass *pSubClass ) const
+{
+	if( IsEquals( pSubClass ) ) return true;
+	return IsSubClass( pSubClass );
 }
 
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp	(revision 446)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp	(revision 447)
@@ -26,11 +26,21 @@
 			return true;
 		}
-
-		if( this->returnType.IsTypeParameter() )
+		else if( this->returnType.IsCovariant( pUserProc->returnType ) )
+		{
+			// 戻り値が共変
+			return true;
+		}
+		else if( this->returnType.IsTypeParameter() )
 		{
 			// 型パラメータだったとき
+
 			if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].Equals( pUserProc->returnType ) )
 			{
 				// 戻り値が等しい
+				return true;
+			}
+			else if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].IsCovariant( pUserProc->returnType ) )
+			{
+				// 戻り値が共変
 				return true;
 			}
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp	(revision 446)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp	(revision 447)
@@ -150,4 +150,15 @@
 	}
 	return false;
+}
+
+bool Type::IsCovariant( const Type &type ) const
+{
+	if( !this->IsObject() || !type.IsObject() )
+	{
+		// 共変性の判別はクラス型のみ
+		return false;
+	}
+
+	return this->GetClass().IsSubClass( &type.GetClass() );
 }
 
