[mcs] Allow properties and indexers of by-ref values to be set without setter
authorMarek Safar <marek.safar@gmail.com>
Tue, 3 Oct 2017 00:27:20 +0000 (02:27 +0200)
committerMarek Safar <marek.safar@gmail.com>
Tue, 3 Oct 2017 09:23:18 +0000 (11:23 +0200)
mcs/mcs/ecore.cs
mcs/tests/test-ref-06.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_x.xml

index 490bcfb518e5c4a78535f71c07bc2e6c8dde9ce4..34ff9a30dab3cb423f4b9f64b7a7640d67a2b56a 100644 (file)
@@ -7394,6 +7394,11 @@ namespace Mono.CSharp {
                                if (ResolveAutopropertyAssignment (rc, right_side))
                                        return this;
 
+                               if (best_candidate.MemberType.Kind == MemberKind.ByRef) {
+                                       getter = CandidateToBaseOverride (rc, best_candidate.Get);
+                                       return ByRefDereference.Create(this).Resolve(rc);
+                               }
+
                                rc.Report.Error (200, loc, "Property or indexer `{0}' cannot be assigned to (it is read-only)",
                                        GetSignatureForError ());
                                return null;
diff --git a/mcs/tests/test-ref-06.cs b/mcs/tests/test-ref-06.cs
new file mode 100644 (file)
index 0000000..74d35f4
--- /dev/null
@@ -0,0 +1,24 @@
+using System;
+
+class X
+{
+       public static int Main ()
+       {
+               var x = new X ();
+               x [0] = 3;
+               if (x.field != 3)
+                       return 1;
+               x.Prop = 5;
+               if (x.field != 5)
+                       return 2;
+
+               return 0;
+       }
+
+       int field;
+
+       ref int this [int idx] => ref field;
+
+       ref int Prop => ref field;
+
+}
\ No newline at end of file
index b111a7e3c5a7ecf197d9e44d133978ad86c83303..16a62d1ce87d50337879aadbe40bed7a49913d54 100644 (file)
       </method>
     </type>
   </test>
+  <test name="test-ref-06.cs">
+    <type name="X">
+      <method name="Int32 Main()" attrs="150">
+        <size>71</size>
+      </method>
+      <method name="Int32&amp; get_Item(Int32)" attrs="2177">
+        <size>14</size>
+      </method>
+      <method name="Int32&amp; get_Prop()" attrs="2177">
+        <size>14</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-static-using-01.cs">
     <type name="A.B.X">
       <method name="Int32 Test()" attrs="150">