Use reduced expression for transparent is check
authorMarek Safar <marek.safar@gmail.com>
Tue, 4 Jan 2011 12:39:28 +0000 (12:39 +0000)
committerMarek Safar <marek.safar@gmail.com>
Tue, 4 Jan 2011 13:06:58 +0000 (13:06 +0000)
mcs/mcs/expression.cs
mcs/tests/gtest-etree-01.cs
mcs/tests/ver-il-gmcs.xml

index 86cdcea0723efe1332471e07db80e4bebe221172..3d7e2abe9e0f046c5532f545706fe9f01f18950d 100644 (file)
@@ -1526,8 +1526,7 @@ namespace Mono.CSharp
                        
                        Expression e = Convert.ImplicitConversionStandard (ec, expr, type, loc);
                        if (e != null) {
-                               expr = e;
-                               return this;
+                               return ReducedExpression.Create (e, this).Resolve (ec);
                        }
 
                        if (Convert.ExplicitReferenceConversionExists (etype, type)){
index 1bc3debd13171a47d3b18a394a51b629460b6bf5..3556924babaa028ef3aabd9ae7a1b7a0dae19157 100644 (file)
@@ -2658,6 +2658,14 @@ class Tester
                Assert (null, e3.Compile ().Invoke (null));
        }
 
+       void TypeAsTest_4 ()
+       {
+               Expression<Func<int, IConvertible>> e = a => a as IConvertible;
+               AssertNodeType (e, ExpressionType.TypeAs);
+               Assert (ExpressionType.Parameter, ((UnaryExpression) e.Body).Operand.NodeType);
+               Assert (5, e.Compile ().Invoke (5));
+       }
+       
        void TypeIsTest ()
        {
                Expression<Func<object, bool>> e = (object a) => a is Tester;
index c974b6f26b3d3311746b82dd618be9820877127f..a342055d41fd6321b0c11f20214f4d7659fbe06f 100644 (file)
         <size>86</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-046.cs">
     <type name="Foo`1[T]">
         <size>17</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-116.cs">
     <type name="Slow.Test">
         <size>1</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-252.cs">
     <type name="EqualityComparer`1[T]">
         <size>86</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-372.cs">
     <type name="TestClass`1[T]">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="ConditionalParsing+Const">
       <method name="Void .ctor()">
         <size>7</size>
         <size>166</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-422.cs">
     <type name="A">
         <size>61</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="B">
       <method name="Void BaseM()">
         <size>1</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-anon-39.cs">
     <type name="Test">
         <size>16</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="Test+&lt;GetItems&gt;c__Iterator0">
       <method name="Void .ctor()">
         <size>7</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="TestCase+&lt;Test&gt;c__AnonStorey0`1[T]">
       <method name="Void &lt;&gt;m__0()">
         <size>46</size>
       <method name="Void NewArrayBoundsTest_4()">
         <size>82</size>
       </method>
-    </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
-    <type name="Tester">
       <method name="Void LeftShiftTest_6()">
         <size>155</size>
       </method>
       <method name="Void RightShiftTest_6()">
         <size>145</size>
       </method>
+      <method name="Void TypeAsTest_4()">
+        <size>113</size>
+      </method>
     </type>
   </test>
   <test name="gtest-etree-02.cs">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-etree-10.cs">
     <type name="Foo`1[T]">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-etree-11.cs">
     <type name="C">
         <size>296</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-implicitarray-02.cs">
     <type name="MyString">
         <size>53</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-initialize-10.cs">
     <type name="Foo">
         <size>40</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-iter-10.cs">
     <type name="Test">
       <method name="Int32 Main()">
         <size>559</size>
       </method>
-    </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
-    <type name="TestGroupBy">
       <method name="Int32 &lt;Main&gt;m__0(Int32)">
         <size>4</size>
       </method>
         <size>2</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-linq-18.cs">
     <type name="C">
         <size>142</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="C+&lt;Main&gt;c__AnonStorey0">
       <method name="Void .ctor()">
         <size>7</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="gtest-optional-13.cs">
     <type name="A">
         <size>91</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-207.cs">
     <type name="X">
         <size>38</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-233.cs">
     <type name="Tests">
         <size>0</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-260.cs">
     <type name="x.Test">
         <size>269</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="FancyInt">
       <method name="Void .ctor(Int32)">
         <size>8</size>
         <size>35</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-360.cs">
     <type name="Application">
         <size>284</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-430.cs">
     <type name="A">
         <size>755</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-450.cs">
     <type name="A">
         <size>39</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-526.cs">
     <type name="Test">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-54.cs">
     <type name="X">
         <size>145</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-555.cs">
     <type name="Test">
         <size>28</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-696.cs">
     <type name="S">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-732.cs">
     <type name="C">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-758.cs">
     <type name="C">
         <size>63</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-89.cs">
     <type name="X">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-anon-53.cs">
     <type name="Test">
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-anon-64.cs">
     <type name="Source">
         <size>3</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-anon-71.cs">
     <type name="Program">
         <size>247</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
     <type name="X+&lt;GetIt&gt;c__Iterator0">
       <method name="Void .ctor()">
         <size>7</size>
         <size>7</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-iter-22.cs">
     <type name="Test">
         <size>167</size>
       </method>
     </type>
-    <type name="&lt;PrivateImplementationDetails&gt;">
-      <method name="Void .ctor()">
-        <size>7</size>
-      </method>
-    </type>
   </test>
   <test name="test-var-05.cs">
     <type name="MyClass">