anchor.diff:          ])));
     }
   
  +  Statement buildReturn(Statement body) {
  +    // Returns from the body have all been translated into assignments to the
  +    // return value variable followed by a break from the labeled body.
  +    return new Block(<Statement>[
  +      body,
  +      new ExpressionStatement(new MethodInvocation(
  +          new VariableGet(completerVariable),
  +          new Name("complete", helper.asyncLibrary),
  +          new Arguments([new VariableGet(returnVariable)]))),
  +      new ReturnStatement()
  +    ]);
  +  }
  +
     visitReturnStatement(ReturnStatement node) {
  -    var expr;
  -    if (node.expression == null) {
  -      expr = new NullLiteral();
  -    } else {
  -      expr = expressionRewriter.rewrite(node.expression, statements);
  -    }
  -
  -    statements.add(new ExpressionStatement(new MethodInvocation(
  -        new VariableGet(completerVariable),
  -        new Name("complete", helper.asyncLibrary),
  -        new Arguments([expr]))));
  -    statements.add(new ReturnStatement(new NullLiteral()));
  +    var expr = node.expression == null
  +        ? new NullLiteral()
  +        : expressionRewriter.rewrite(node.expression, statements);
  +    statements
  +        .add(new ExpressionStatement(new VariableSet(returnVariable, expr)));
  +    statements
  +        .add(new BreakStatement(labeledBody)..fileOffset = node.fileOffset);
       return null;
     }
   }
  
positive.code:         ])));
    }
  
    TreeNode visitYieldStatement(YieldStatement stmt) {
      Expression expr = expressionRewriter.rewrite(stmt.expression, statements);
  
  
negative.code:         isFinal: true);
      statements.add(completerVariable);
  
      returnVariable = new VariableDeclaration(":return_value");
      statements.add(returnVariable);
  
      setupAsyncContinuations(statements);
  
      // new Future.microtask(:async_op);
      var newMicrotaskStatement = new ExpressionStatement(new StaticInvocation(
  