2008-06-11 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / mcs / lambda.cs
index d9766356dd30065ede23826cda3b39c34f7a2989..b561487a33783739f9d9e3814bbaa76bfcb208a0 100644 (file)
@@ -4,9 +4,9 @@
 // Authors: Miguel de Icaza (miguel@gnu.org)
 //          Marek Safar (marek.safar@gmail.com)
 //
-// Licensed under the terms of the GNU GPL
+// Dual licensed under the terms of the MIT X11 or GNU GPL
 //
-// (C) 2007 Novell, Inc
+// Copyright 2007-2008 Novell, Inc
 //
 
 using System;
@@ -149,6 +149,11 @@ namespace Mono.CSharp {
                                return "lambda expression";
                        }
                }
+
+               public override Expression CreateExpressionTree (EmitContext ec)
+               {
+                       return Block.CreateExpressionTree (ec);
+               }
        }
 
        //
@@ -176,7 +181,7 @@ namespace Mono.CSharp {
                                base.Emit (ec);
                }
 
-               public override bool Resolve (EmitContext ec)
+               protected override bool DoResolve (EmitContext ec)
                {       
                        //
                        // When delegate returns void, only expression statements can be used
@@ -186,14 +191,17 @@ namespace Mono.CSharp {
                                if (Expr == null)
                                        return false;
                                
-                               if (Expr is ExpressionStatement && (Expr is Assign || TypeManager.IsEqual (Expr.Type, ec.ReturnType)))
+                               if (Expr is ExpressionStatement) {
+                                       if (Expr is Invocation)
+                                               return TypeManager.IsEqual (Expr.Type, TypeManager.void_type);
                                        return true;
+                               }
                                
                                Expr.Error_InvalidExpressionStatement ();
                                return false;
                        }
 
-                       return base.Resolve (ec);
+                       return base.DoResolve (ec);
                }
        }
 }