[mcs] Pending implementation of accessors cannot hide base implementation with differ...
authorMarek Safar <marek.safar@gmail.com>
Thu, 3 Aug 2017 22:24:38 +0000 (00:24 +0200)
committerMarek Safar <marek.safar@gmail.com>
Thu, 3 Aug 2017 22:24:38 +0000 (00:24 +0200)
mcs/mcs/pending.cs
mcs/tests/test-947.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_x.xml

index 507b937e2c904310786e8798ee2196d2ef52dcb2..1de765fb4ac041eb7926c501e0aeb235c98579ad 100644 (file)
@@ -545,12 +545,15 @@ namespace Mono.CSharp {
 
                                if (new_implementation) {
                                        MemberFilter filter;
-                                       if (mi.Parameters.Count > 1) {
-                                               var indexer_params = mi.Name [0] == 'g' ? mi.Parameters : IndexerSpec.CreateParametersFromSetter (mi, mi.Parameters.Count - 1);
-                                               filter = new MemberFilter (MemberCache.IndexerNameAlias, 0, MemberKind.Indexer, indexer_params, null);
+                                       bool getter = mi.Name [0] == 'g';
+                                       if (mi.Parameters.Count > (getter ? 0 : 1)) {
+                                               var indexer_params = getter ? mi.Parameters : IndexerSpec.CreateParametersFromSetter (mi, mi.Parameters.Count - 1);
+                                               var ptype = getter ? mi.ReturnType : mi.Parameters.Types [mi.Parameters.Count - 1];
+                                               filter = new MemberFilter (MemberCache.IndexerNameAlias, 0, MemberKind.Indexer, indexer_params, ptype);
                                        } else {
                                                var pname = mi.Name.Substring (4);
-                                               filter = MemberFilter.Property (pname, null);
+                                               var ptype = getter ? mi.ReturnType : mi.Parameters.Types [0];
+                                               filter = MemberFilter.Property (pname, ptype);
                                        }
 
                                        var prop = MemberCache.FindMember (container.CurrentType, filter, BindingRestriction.DeclaredOnly | BindingRestriction.InstanceOnly);
diff --git a/mcs/tests/test-947.cs b/mcs/tests/test-947.cs
new file mode 100644 (file)
index 0000000..f2f8cbb
--- /dev/null
@@ -0,0 +1,29 @@
+interface IA
+{
+       int Prop { get; }
+       int this [int arg] { get; }
+}
+
+abstract class B : IA
+{
+    public long Prop => 4;
+
+       int IA.Prop => 1;
+
+       public long this [int arg] => 2;
+
+       int IA.this [int arg] => 4;
+}
+
+class C : B, IA
+{
+       public static void Main ()
+       {
+       }
+
+       public new string Prop {
+               get { return ""; }
+       }
+
+       public new string this [int arg] => "2";
+}
\ No newline at end of file
index 221283df2e4e6f62662a6dcc4d17c30a2e5428bc..d570269b1111114ffb12dbd627168c99c644e409 100644 (file)
       </method>
     </type>
   </test>
+  <test name="test-947.cs">
+    <type name="B">
+      <method name="Int64 get_Prop()" attrs="2182">
+        <size>10</size>
+      </method>
+      <method name="Int32 IA.get_Prop()" attrs="2529">
+        <size>9</size>
+      </method>
+      <method name="Int64 get_Item(Int32)" attrs="2182">
+        <size>10</size>
+      </method>
+      <method name="Int32 IA.get_Item(Int32)" attrs="2529">
+        <size>9</size>
+      </method>
+      <method name="Void .ctor()" attrs="6276">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="C">
+      <method name="Void Main()" attrs="150">
+        <size>2</size>
+      </method>
+      <method name="System.String get_Prop()" attrs="2182">
+        <size>14</size>
+      </method>
+      <method name="System.String get_Item(Int32)" attrs="2182">
+        <size>13</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-95.cs">
     <type name="X">
       <method name="Int32 Main()" attrs="150">