+
+ public override Expression CreateExpressionTree (ResolveContext ec)
+ {
+ return Expr.CreateExpressionTree (ec);
+ }
+
+ public override void Emit (EmitContext ec)
+ {
+ if (statement != null) {
+ statement.EmitStatement (ec);
+ ec.Emit (OpCodes.Ret);
+ return;
+ }
+
+ base.Emit (ec);
+ }
+
+ protected override bool DoResolve (BlockContext ec)
+ {
+ //
+ // When delegate returns void, only expression statements can be used
+ //
+ if (ec.ReturnType == TypeManager.void_type) {
+ Expr = Expr.Resolve (ec);
+ if (Expr == null)
+ return false;
+
+ statement = Expr as ExpressionStatement;
+ if (statement == null)
+ Expr.Error_InvalidExpressionStatement (ec);
+
+ return true;
+ }
+
+ return base.DoResolve (ec);
+ }