2010-06-16 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Wed, 16 Jun 2010 08:29:53 +0000 (08:29 -0000)
committerMarek Safar <marek.safar@gmail.com>
Wed, 16 Jun 2010 08:29:53 +0000 (08:29 -0000)
* expression.cs, statement.cs: Always persist explicit cast
semantic at expression level.

svn path=/trunk/mcs/; revision=159004

mcs/mcs/ChangeLog
mcs/mcs/expression.cs
mcs/mcs/statement.cs

index a089a3d2d350a8628673edadeb60eb725ca5f384..cf5f8b5aef9ac9376dce3fbe908ff8fc1dc5d980 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-16  Marek Safar  <marek.safar@gmail.com>
+
+       * expression.cs, statement.cs: Always persist explicit cast
+       semantic at expression level.
+       
 2010-06-15  Marek Safar  <marek.safar@gmail.com>
 
        * expression.cs, attribute.cs: Enable generic type parameters
index 8436dc052a2236c0743c2fb666f9bf1e2d77911b..eb40c97d3d3ca6dc9382332acd4354477ff5e841 100644 (file)
@@ -1488,19 +1488,11 @@ namespace Mono.CSharp {
                }
        }
        
-       /// <summary>
-       ///   This represents a typecast in the source language.
-       ///
-       ///   FIXME: Cast expressions have an unusual set of parsing
-       ///   rules, we need to figure those out.
-       /// </summary>
+       //
+       // This represents a typecast in the source language.
+       //
        public class Cast : ShimExpression {
                Expression target_type;
-                       
-               public Cast (Expression cast_type, Expression expr)
-                       : this (cast_type, expr, cast_type.Location)
-               {
-               }
 
                public Cast (Expression cast_type, Expression expr, Location loc)
                        : base (expr)
@@ -1547,8 +1539,11 @@ namespace Mono.CSharp {
                                return new DynamicConversion (type, CSharpBinderFlags.ConvertExplicit, arg, loc).Resolve (ec);
                        }
 
-                       expr = Convert.ExplicitConversion (ec, expr, type, loc);
-                       return expr;
+                       var res = Convert.ExplicitConversion (ec, expr, type, loc);
+                       if (res == expr)
+                               return EmptyCast.Create (res, type);
+
+                       return res;
                }
                
                protected override void CloneTo (CloneContext clonectx, Expression t)
index a50a0f740ec9a4b1e7780862e9452a1a78ad9bb5..30414dba290fecca8ec642e1eba630448cb9d619 100644 (file)
@@ -4746,7 +4746,7 @@ namespace Mono.CSharp {
 
                        var dispose_mg = new MethodGroupExpr (TypeManager.void_dispose_void, TypeManager.idisposable_type, loc) {
                                InstanceExpression = TypeManager.IsNullableType (expr_type) ?
-                               new Cast (new TypeExpression (TypeManager.idisposable_type, loc), local_copy).Resolve (ec) :
+                               new Cast (new TypeExpression (TypeManager.idisposable_type, loc), local_copy, loc).Resolve (ec) :
                                local_copy
                        };