anchor.diff:    }
   
     TreeNode visitReturnStatement(ReturnStatement node) {
  -    // async* functions cannot have normal [ReturnStatement]s in them.
  +    // Async* functions cannot return a value.
       assert(node.expression == null || node.expression is NullLiteral);
  -
  -    statements.add(new ExpressionStatement(new MethodInvocation(
  -        new VariableGet(controllerVariable),
  -        new Name("close", helper.asyncLibrary),
  -        new Arguments(<Expression>[]))));
  -    statements.add(new ReturnStatement());
  +    statements
  +        .add(new BreakStatement(labeledBody)..fileOffset = node.fileOffset);
       return null;
     }
   }
   
   class AsyncFunctionRewriter extends AsyncRewriterBase {
     VariableDeclaration completerVariable;
  +  VariableDeclaration returnVariable;
   
     AsyncFunctionRewriter(helper, enclosingFunction)
         : super(helper, enclosingFunction);
  
positive.code:     return null;
    }
  
    TreeNode visitReturnStatement(ReturnStatement stmt) {
      if (stmt.expression != null) {
        stmt.expression = expressionRewriter.rewrite(stmt.expression, statements)
          ..parent = stmt;
      }
      statements.add(stmt);
      return null;
    }
  
    TreeNode visitTryCatch(TryCatch stmt) {
      ++currentTryDepth;
      stmt.body = visitDelimited(stmt.body)..parent = stmt;
  
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(
  