2007-11-14 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Wed, 14 Nov 2007 13:14:02 +0000 (13:14 -0000)
committerMarek Safar <marek.safar@gmail.com>
Wed, 14 Nov 2007 13:14:02 +0000 (13:14 -0000)
  * lambda.cs, statement.cs: Contextual return may act as a statement.

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

mcs/mcs/ChangeLog
mcs/mcs/lambda.cs
mcs/mcs/statement.cs

index ed70ba6a2268589599e07b6462084b5c72d05f8d..4e887077f99047bf1e84102353cb9d404a7f2ed0 100644 (file)
@@ -1,3 +1,7 @@
+2007-11-14  Marek Safar  <marek.safar@gmail.com>
+
+       * lambda.cs, statement.cs: Contextual return may act as a statement.
+
 2007-11-14  Marek Safar  <marek.safar@gmail.com>
 
        A fix for a regression cause by #324222
index 9a30fddcb846336b299fbe7f2f2ffddb2afe8790..43f6996253d30b6686af877aab1d1e3397c27f25 100644 (file)
@@ -140,9 +140,29 @@ namespace Mono.CSharp {
 
        public class ContextualReturn : Return
        {
+               bool statement_return;
+
                public ContextualReturn (Expression expr)
                        : base (expr, expr.Location)
                {
                }
+
+               public override void Emit (EmitContext ec)
+               {
+                       if (statement_return)
+                               ((ExpressionStatement)Expr).EmitStatement (ec);
+                       else
+                               base.Emit (ec);
+               }
+
+               public override bool Resolve (EmitContext ec)
+               {
+                       if (ec.ReturnType == TypeManager.void_type) {
+                               statement_return = true;
+                               return Expr.Resolve (ec) != null;
+                       }
+
+                       return base.Resolve (ec);
+               }
        }
 }
index d97ecd0e7d0a81212037f08bf1dc56d0f50a08a3..ab2a28b0d8ce243a1c381844942828d8a891d46c 100644 (file)
@@ -714,7 +714,7 @@ namespace Mono.CSharp {
        ///   Implements the return statement
        /// </summary>
        public class Return : Statement {
-               Expression Expr;
+               protected Expression Expr;
                bool unwind_protect;
                
                public Return (Expression expr, Location l)