Lift result of enum substraction when operation is lifted due to non-nullable enum...
authorMarek Safar <marek.safar@gmail.com>
Fri, 26 Jul 2013 14:20:25 +0000 (16:20 +0200)
committerMarek Safar <marek.safar@gmail.com>
Fri, 26 Jul 2013 14:30:39 +0000 (16:30 +0200)
mcs/mcs/expression.cs
mcs/tests/gtest-590.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index 4e26c1cf71055486cf4c0fe6eec1013ae40286ed..7dd42aa141f208c66607d59477a481c6c33cbccb 100644 (file)
@@ -3719,10 +3719,15 @@ namespace Mono.CSharp
                                                Nullable.NullableInfo.GetEnumUnderlyingType (rc.Module, left.Type) :
                                                EnumSpec.GetUnderlyingType (left.Type);
                                }
-                       } else if (IsEnumOrNullableEnum (left.Type)) {
-                               result_type = left.Type;
                        } else {
-                               result_type = right.Type;
+                               if (IsEnumOrNullableEnum (left.Type)) {
+                                       result_type = left.Type;
+                               } else {
+                                       result_type = right.Type;
+                               }
+
+                               if (expr is Nullable.LiftedBinaryOperator && !result_type.IsNullableType)
+                                       result_type = rc.Module.PredefinedTypes.Nullable.TypeSpec.MakeGenericType (rc.Module, new[] { result_type });
                        }
 
                        return EmptyCast.Create (expr, result_type);
diff --git a/mcs/tests/gtest-590.cs b/mcs/tests/gtest-590.cs
new file mode 100644 (file)
index 0000000..96c276a
--- /dev/null
@@ -0,0 +1,21 @@
+using System;
+
+enum E
+{
+       V
+}
+
+class C
+{
+       public static void Main ()
+       {
+               byte? foo = 0;
+               E e = 0;
+               var res = foo - e;
+               Console.WriteLine (res);
+               var res2 = e - foo;
+               Console.WriteLine (res2);
+               res = null;
+               res2 = null;
+       }
+}
\ No newline at end of file
index 2fa9e77fa213397965abc4a41cbb9ea9814f695d..926455235b922746b2cb8422e2983e1c1cd54b55 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-590.cs">\r
+    <type name="C">\r
+      <method name="Void Main()" attrs="150">\r
+        <size>132</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-anontype-01.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r