[mcs] Expand type parameter member change using effective base type
authorMarek Safar <marek.safar@gmail.com>
Fri, 23 May 2014 08:57:14 +0000 (10:57 +0200)
committerMarek Safar <marek.safar@gmail.com>
Fri, 23 May 2014 08:57:48 +0000 (10:57 +0200)
mcs/mcs/generic.cs
mcs/tests/gtest-613.cs
mcs/tests/ver-il-net_4_5.xml

index 7a44a4c7e1574d1ecf231e13bd40410ce8ebceec..89fd1a2e6ac9c7799a7b28e27fb854761fcb7a92 100644 (file)
@@ -1317,12 +1317,17 @@ namespace Mono.CSharp {
 
                        if (targs != null) {
                                foreach (var ta in targs) {
-                                       var b_type = ta.BaseType;
-                                       if (b_type.BuiltinType != BuiltinTypeSpec.Type.Object && b_type.BuiltinType != BuiltinTypeSpec.Type.ValueType)
-                                               cache.AddBaseType (b_type);
-
                                        var tps = ta as TypeParameterSpec;
-                                       var ifaces = tps != null ? tps.InterfacesDefined : ta.Interfaces;
+                                       IList<TypeSpec> ifaces;
+                                       if (tps != null) {
+                                               var b_type = tps.GetEffectiveBase ();
+                                               if (b_type != null && b_type.BuiltinType != BuiltinTypeSpec.Type.Object && b_type.BuiltinType != BuiltinTypeSpec.Type.ValueType)
+                                                       cache.AddBaseType (b_type);
+
+                                               ifaces = tps.InterfacesDefined;
+                                       } else {
+                                               ifaces = ta.Interfaces;
+                                       }
 
                                        if (ifaces != null) {
                                                foreach (var iface_type in ifaces) {
index 56e239ede780fb37cd9d88fa5f4cd1d07377211e..963642b85712a3123ef5d5b054c3bb20595f870b 100644 (file)
@@ -8,6 +8,12 @@ class X
        {
                C<X, X, X>.Test (new X ());
        }
+
+       public int Prop {
+               get {
+                       return 5;
+               }
+       }
 }
 
 class Y
@@ -22,5 +28,6 @@ class C<T1, T2, T3>
        public static void Test (T3 t3)
        {
                X.Foo (t3);
+               var g = t3.Prop;
        }
 }
\ No newline at end of file
index 990b82fa521b882021a8430c93468516f8a7e7b1..19d9696f82c022aed828f8fb4e98ad92b6a9ab45 100644 (file)
     </type>\r
     <type name="C`3[T1,T2,T3]">\r
       <method name="Void Test(T3)" attrs="150">\r
-        <size>13</size>\r
+        <size>27</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Int32 get_Prop()" attrs="2182">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-anontype-01.cs">\r
     <type name="Test">\r