[mcs] Don't apply reference type is optimization for dynamic expressions. Fixes ...
authorMarek Safar <marek.safar@gmail.com>
Fri, 2 May 2014 16:01:42 +0000 (18:01 +0200)
committerMarek Safar <marek.safar@gmail.com>
Fri, 2 May 2014 16:02:29 +0000 (18:02 +0200)
mcs/mcs/expression.cs
mcs/tests/dtest-006.cs
mcs/tests/ver-il-net_4_5.xml

index 5b4215b70fa0032f52dcdc4a4a6387432c1bcf1c..582c4adce8a80684fde524d000719c0b1530b3a9 100644 (file)
@@ -1604,12 +1604,15 @@ namespace Mono.CSharp
                                                        return CreateConstantResult (ec, !c.IsNull);
 
                                                //
-                                               // Do not optimize for imported type
+                                               // Do not optimize for imported type or dynamic type
                                                //
                                                if (d.MemberDefinition.IsImported && d.BuiltinType != BuiltinTypeSpec.Type.None &&
                                                        d.MemberDefinition.DeclaringAssembly != t.MemberDefinition.DeclaringAssembly) {
                                                        return this;
                                                }
+
+                                               if (d.BuiltinType == BuiltinTypeSpec.Type.Dynamic)
+                                                       return this;
                                                
                                                //
                                                // Turn is check into simple null check for implicitly convertible reference types
index 599c3a511fa659686839a962a77c942210d358c6..4d80081df540c48b18161d2157352a64afedc54c 100644 (file)
@@ -1104,6 +1104,14 @@ class Tester
                Assert (d2 >= null, false, "#3a");
        }
 
+       void IsTest ()
+       {
+               dynamic d = 1;
+               Assert (d is long, false, "#1");
+               Assert (d is int, true, "#2");
+               Assert (d is string, false, "#3");
+       }
+
        void LeftShiftTest ()
        {
                dynamic d = (ulong) 0x7F000;
index dff5b10a40d0819881addc0f6edd831c0f845741..7ba1f27994a291ae09a7952d4404f92268a99da1 100644 (file)
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="Tester">\r
+      <method name="Void IsTest()" attrs="129">\r
+        <size>69</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="dtest-007.cs">\r
     <type name="D">\r