[mcs] Implements virtual read-only auto-property assignment via derived private field
authorMarek Safar <marek.safar@gmail.com>
Fri, 19 Jun 2015 09:43:16 +0000 (11:43 +0200)
committerMarek Safar <marek.safar@gmail.com>
Fri, 19 Jun 2015 09:46:55 +0000 (11:46 +0200)
mcs/mcs/ecore.cs
mcs/tests/gtest-autoproperty-19.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index 74501e89b1503db64ab68fca1a7a884ba1632867..f34ba17146dc0730175ae02197d82dd0aa1e423d 100644 (file)
@@ -7036,6 +7036,14 @@ namespace Mono.CSharp {
                        if (!rc.HasSet (ResolveContext.Options.ConstructorScope))
                                return false;
 
+                       if (prop.Parent.PartialContainer != rc.CurrentMemberDefinition.Parent.PartialContainer) {
+                               var ps = MemberCache.FindMember (rc.CurrentType, MemberFilter.Property (prop.ShortName, prop.MemberType), BindingRestriction.DeclaredOnly) as PropertySpec;
+                               if (ps == null)
+                                       return false;
+
+                               prop = (Property) ps.MemberDefinition;
+                       }
+
                        var spec = prop.BackingField;
                        if (spec == null)
                                return false;
diff --git a/mcs/tests/gtest-autoproperty-19.cs b/mcs/tests/gtest-autoproperty-19.cs
new file mode 100644 (file)
index 0000000..58f9d0f
--- /dev/null
@@ -0,0 +1,23 @@
+abstract class Node
+{
+       public virtual int Next { get; }
+}
+
+class NodeLinked : Node
+{
+       public NodeLinked (int next)
+       {
+               this.Next = next;
+       }
+
+       public override int Next { get; }
+
+       public static int Main ()
+       {
+               var nl = new NodeLinked (5);
+               if (nl.Next != 5)
+                       return 1;
+
+               return 0;
+       }
+}
index f14709cfc33b84b58d9750c600bb36e832b43512..7bc1d30af967950763f691ea722b9ad06e3cef66 100644 (file)
       </method>
     </type>
   </test>
+  <test name="gtest-autoproperty-19.cs">
+    <type name="Node">
+      <method name="Int32 get_Next()" attrs="2502">
+        <size>14</size>
+      </method>
+      <method name="Void .ctor()" attrs="6276">
+        <size>7</size>
+      </method>
+    </type>
+    <type name="NodeLinked">
+      <method name="Int32 get_Next()" attrs="2246">
+        <size>14</size>
+      </method>
+      <method name="Int32 Main()" attrs="150">
+        <size>36</size>
+      </method>
+      <method name="Void .ctor(Int32)" attrs="6278">
+        <size>15</size>
+      </method>
+    </type>
+  </test>
   <test name="gtest-collectioninit-01.cs">
     <type name="Test">
       <method name="Void TestList(System.Collections.Generic.List`1[System.Int32], Int32)" attrs="145">