[mcs] Use constrained prefix for enum calls too
authorMarek Safar <marek.safar@gmail.com>
Thu, 29 May 2014 10:52:09 +0000 (12:52 +0200)
committerMarek Safar <marek.safar@gmail.com>
Thu, 29 May 2014 10:52:09 +0000 (12:52 +0200)
mcs/mcs/codegen.cs
mcs/mcs/typespec.cs
mcs/tests/ver-il-net_4_5.xml

index 84394c99eddcfa7ca87737d0b21d71b9df39c9e1..ff77e33340ab620d7331ab0fd3ff1ff36c5001a1 100644 (file)
@@ -1036,7 +1036,7 @@ namespace Mono.CSharp
                                }
                        }
 
-                       if (call_op == OpCodes.Callvirt && (InstanceExpression.Type.IsGenericParameter || InstanceExpression.Type.IsStruct)) {
+                       if (call_op == OpCodes.Callvirt && (InstanceExpression.Type.IsGenericParameter || InstanceExpression.Type.IsStructOrEnum)) {
                                ec.Emit (OpCodes.Constrained, InstanceExpression.Type);
                        }
 
@@ -1076,7 +1076,7 @@ namespace Mono.CSharp
                        //
                        // Push the instance expression
                        //
-                       if ((instance_type.IsStruct && (callOpcode == OpCodes.Callvirt || (callOpcode == OpCodes.Call && declaringType.IsStruct))) ||
+                       if ((instance_type.IsStructOrEnum && (callOpcode == OpCodes.Callvirt || (callOpcode == OpCodes.Call && declaringType.IsStruct))) ||
                                instance_type.IsGenericParameter || declaringType.IsNullableType) {
                                //
                                // If the expression implements IMemoryLocation, then
@@ -1098,7 +1098,7 @@ namespace Mono.CSharp
                                return ReferenceContainer.MakeType (ec.Module, instance_type);
                        }
 
-                       if (instance_type.IsEnum || instance_type.IsStruct) {
+                       if (instance_type.IsStructOrEnum) {
                                instance.Emit (ec);
                                ec.Emit (OpCodes.Box, instance_type);
                                return ec.BuiltinTypes.Object;
index 73d82b086f97752c46a2af57bdc684a48d80b0ab..339addfd15e11ff1e6859856bbb29449b2b30ed4 100644 (file)
@@ -295,6 +295,12 @@ namespace Mono.CSharp
                        }
                }
 
+               public bool IsStructOrEnum {
+                       get {
+                               return (Kind & (MemberKind.Struct | MemberKind.Enum)) != 0;
+                       }
+               }
+
                public bool IsTypeBuilder {
                        get {
 #if STATIC
index 4e3600db73f56ae524f5f367b243bd552fa5d4b4..e6ca47f73d763c3078d2279e31225edaff6bc50c 100644 (file)
   <test name="gtest-433.cs">\r
     <type name="M">\r
       <method name="Void Main()" attrs="150">\r
-        <size>38</size>\r
+        <size>42</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>28</size>\r
       </method>\r
       <method name="Void ThisWorksFine()" attrs="150">\r
-        <size>39</size>\r
+        <size>41</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>33</size>\r
       </method>\r
       <method name="T Value[T]()" attrs="145">\r
-        <size>84</size>\r
+        <size>86</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-279.cs">\r
     <type name="FlagsAttributeDemo">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>51</size>\r
+        <size>55</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-376.cs">\r
     <type name="C">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>90</size>\r
+        <size>99</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Test">\r
       <method name="Void Main()" attrs="150">\r
-        <size>72</size>\r
+        <size>76</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-453.cs">\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
-        <size>34</size>\r
+        <size>38</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="X">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>197</size>\r
+        <size>204</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Tester+&lt;CallTest_4&gt;c__async15">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>234</size>\r
+        <size>240</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;CallTest_5&gt;c__async16">\r