2010-06-01 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Tue, 1 Jun 2010 14:11:05 +0000 (14:11 -0000)
committerMarek Safar <marek.safar@gmail.com>
Tue, 1 Jun 2010 14:11:05 +0000 (14:11 -0000)
A fix for bug #610139
* generic.cs, convert.cs: Recursively check effective base interface

svn path=/trunk/mcs/; revision=158277

mcs/mcs/ChangeLog
mcs/mcs/convert.cs
mcs/mcs/generic.cs

index 5ad36a73aa5d0bc0833bf6660ceee67836b0fa73..7b42518e57672479998a2505a34fb9eb791e2509 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-01  Marek Safar  <marek.safar@gmail.com>
+
+       A fix for bug #610139
+       * generic.cs, convert.cs: Recursively check effective base interface
+
 2010-06-01  Marek Safar  <marek.safar@gmail.com>
 
        * statement.cs: Handle nullable types and type parameters in using
index b110949b8975e0d5234000504dd81edffd9c5968..e81383ddc54f372706ce8e3cb003542cd5e01a9c 100644 (file)
@@ -120,16 +120,11 @@ namespace Mono.CSharp {
                                return new BoxedCast (expr, target_type);
                        }
 
-                       var effective_ifaces = expr_type.Interfaces;
-                       if (effective_ifaces != null) {
-                               foreach (var t in effective_ifaces) {
-                                       if (t == target_type || t.ImplementsInterface (target_type)) {
-                                               if (expr_type.IsReferenceType)
-                                                       return new ClassCast (expr, target_type);
-
-                                               return new BoxedCast (expr, target_type);
-                                       }
-                               }
+                       if (target_type.IsInterface && expr_type.IsConvertibleToInterface (target_type)) {
+                               if (expr_type.IsReferenceType)
+                                       return new ClassCast (expr, target_type);
+
+                               return new BoxedCast (expr, target_type);
                        }
 
                        return null;
index 630acb88d2d0b7f6ebe646bc683ba757b85e6ae3..1b3dc81b71bca6ca78290388c9f41af23c70f327 100644 (file)
@@ -976,6 +976,25 @@ namespace Mono.CSharp {
                        }
                }
 
+               public bool IsConvertibleToInterface (TypeSpec iface)
+               {
+                       if (Interfaces != null) {
+                               foreach (var t in Interfaces) {
+                                       if (t == iface)
+                                               return true;
+                               }
+                       }
+
+                       if (TypeArguments != null) {
+                               foreach (var t in TypeArguments) {
+                                       if (((TypeParameterSpec) t).IsConvertibleToInterface (iface))
+                                               return true;
+                               }
+                       }
+
+                       return false;
+               }
+
                public override TypeSpec Mutate (TypeParameterMutator mutator)
                {
                        return mutator.Mutate (this);