anchor.diff:          parts.initialization?.accept(this);
         }
         if (parts.condition != null) {
  -        _handleAssignment(parts.condition,
  -            destinationType: _nonNullableBoolType);
  +        _checkExpressionNotNull(parts.condition);
         }
       } else if (parts is ForEachParts) {
         if (parts is ForEachPartsWithDeclaration) {
           _flowAnalysis.add(parts.loopVariable.declaredElement, assigned: true);
         }
  -      _handleAssignment(parts.iterable, destinationType: _notNullType);
  +      _checkExpressionNotNull(parts.iterable);
       }
   
       // The condition may fail/iterable may be empty, so the body gets a new
  
positive.code:     } else if (operatorType == TokenType.AMPERSAND_AMPERSAND ||
          operatorType == TokenType.BAR_BAR) {
        bool isAnd = operatorType == TokenType.AMPERSAND_AMPERSAND;
        _handleAssignment(node.leftOperand,
            destinationType: _nonNullableBoolType);
        _flowAnalysis.logicalBinaryOp_rightBegin(node.leftOperand, isAnd: isAnd);
        _postDominatedLocals.doScoped(
            action: () => _handleAssignment(node.rightOperand,
                destinationType: _nonNullableBoolType));
        _flowAnalysis.logicalBinaryOp_end(node, node.rightOperand, isAnd: isAnd);
        return _nonNullableBoolType;
      } else if (operatorType == TokenType.QUESTION_QUESTION) {
  
negative.code: 
    @override
    DecoratedType visitPrefixExpression(PrefixExpression node) {
      var targetType = _checkExpressionNotNull(node.operand);
      var operatorType = node.operator.type;
      if (operatorType == TokenType.BANG) {
        return _nonNullableBoolType;
  