+2008-03-14 Marek Safar <marek.safar@gmail.com>
+
+ A fix for bug #370577
+ * statement.cs, lambda.cs: Added extra limitations when dealing with void
+ return type.
+
2008-03-14 Marek Safar <marek.safar@gmail.com>
* typemanager.cs (CSharpName): Made 250 times faster.
//
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 es = Expr as ExpressionStatement;
- if (es == null) {
- Expr.Error_InvalidExpressionStatement ();
- return;
- }
-
- es.EmitStatement (ec);
- return;
- }
-
- base.Emit (ec);
+ if (ec.ReturnType == TypeManager.void_type)
+ ((ExpressionStatement) Expr).EmitStatement (ec);
+ else
+ base.Emit (ec);
}
public override bool Resolve (EmitContext ec)
- {
+ {
+ //
+ // When delegate returns void, only expression statements can be used
+ //
if (ec.ReturnType == TypeManager.void_type) {
- statement_return = true;
Expr = Expr.Resolve (ec);
- return Expr != null;
+ if (Expr == null)
+ return false;
+
+ if (Expr is ExpressionStatement)
+ return true;
+
+ Expr.Error_InvalidExpressionStatement ();
+ return false;
}
return base.Resolve (ec);
if (Expr.Type != ec.ReturnType) {
if (ec.InferReturnType) {
+ //
+ // void cannot be used in contextual return
+ //
+ if (Expr.Type == TypeManager.void_type)
+ return false;
+
ec.ReturnType = Expr.Type;
} else {
Expr = Convert.ImplicitConversionRequired (