anchor.diff:            interfaceTarget: iteratorCurrent, resultType: elementType)
           ..fileOffset = stmt.bodyOffset);
   
  -    final Block body = Block([variable, stmt.body])
  -      ..fileOffset = stmt.fileOffset;
  -
  -    return Block([
  -      iterator,
  -      ForStatement(const [], isAsync ? AwaitExpression(condition) : condition,
  -          const [], body)
  -    ]).accept<TreeNode>(this);
  +    Block body = Block([variable, stmt.body])..fileOffset = stmt.fileOffset;
  +
  +    Statement forStatement = ForStatement(
  +        const [],
  +        isAsync
  +            ? VariableSet(jumpSentinel, AwaitExpression(condition))
  +            : condition,
  +        const [],
  +        body);
  +
  +    // Wrap the body with a try / finally to cancel the stream on breaking out
  +    // of the loop.
  +    if (isAsync) {
  +      forStatement = TryFinally(
  +        Block([forStatement]),
  +        Block([
  +          IfStatement(
  +              VariableGet(jumpSentinel),
  +              ExpressionStatement(AwaitExpression(InstanceInvocation(
  +                  InstanceAccessKind.Instance,
  +                  VariableGet(iterator),
  +                  Name('cancel'),
  +                  Arguments(const []),
  +                  interfaceTarget: coreTypes.streamIteratorCancel,
  +                  functionType: coreTypes.streamIteratorCancel.getterType
  +                      as FunctionType))),
  +              null)
  +        ]),
  +      );
  +    }
  +
  +    return Block([iterator, if (isAsync) jumpSentinel, forStatement])
  +        .accept<TreeNode>(this);
     }
   
     @override
  
positive.code:         type: iteratorType)
        ..fileOffset = iterable.fileOffset;
  
      final condition = InstanceInvocation(InstanceAccessKind.Instance,
          VariableGet(iterator), Name('moveNext'), Arguments(const []),
          interfaceTarget: iteratorMoveNext,
  
negative.code:     //
      //  {
      //    final StreamIterator<T> #forIterator = StreamIterator(<stream>);
      //    bool #jumpSentinel = false;
      //    try {
      //      for (; jumpSentinel = await #forIterator.moveNext() ;) {
      //        {var/final} T variable = #forIterator.current;
      //        ...
      //      }
      //    } finally {
      //      if (#jumpSentinel) {
      //        await #forIterator.cancel();
      //      }
      //    }
      //  }
  