anchor.diff:    DecoratedType visitWhileStatement(WhileStatement node) {
       // Note: we do not create guards. A null check here is *very* unlikely to be
       // unnecessary after analysis.
  -    _handleAssignment(node.condition, destinationType: _notNullType);
  +    _handleAssignment(node.condition, destinationType: _nonNullableBoolType);
       _postDominatedLocals.doScoped(action: () => node.body.accept(this));
       return null;
     }
  
positive.code:     } else if (operatorType == TokenType.AMPERSAND_AMPERSAND ||
          operatorType == TokenType.BAR_BAR) {
        bool isAnd = operatorType == TokenType.AMPERSAND_AMPERSAND;
        _handleAssignment(node.leftOperand, destinationType: _notNullType);
        _flowAnalysis.logicalBinaryOp_rightBegin(node.leftOperand, isAnd: isAnd);
        _postDominatedLocals.doScoped(
            action: () => _handleAssignment(node.rightOperand,
                destinationType: _notNullType));
        _flowAnalysis.logicalBinaryOp_end(node, node.rightOperand, isAnd: isAnd);
        return _nonNullableBoolType;
      } else if (operatorType == TokenType.QUESTION_QUESTION) {
  
negative.code: 
    @override
    DecoratedType visitIfElement(IfElement node) {
      _handleAssignment(node.condition, destinationType: _nonNullableBoolType);
      NullabilityNode trueGuard;
      NullabilityNode falseGuard;
      if (identical(_conditionInfo?.condition, node.condition)) {
  