anchor.diff:    @override
     void isExpression_end(Expression isExpression, Expression subExpression,
         bool isNot, Type type) {
  -    ExpressionInfo<Variable, Type> subExpressionInfo =
  -        _getExpressionInfo(subExpression);
  -    if (subExpressionInfo is _VariableReadInfo<Variable, Type>) {
  -      ExpressionInfo<Variable, Type> expressionInfo =
  -          _current.tryPromoteForTypeCheck(
  -              typeOperations, subExpressionInfo._variable, type);
  +    Variable subExpressionVariable = _getExpressionVariable(subExpression);
  +    if (subExpressionVariable != null) {
  +      ExpressionInfo<Variable, Type> expressionInfo = _current
  +          .tryPromoteForTypeCheck(typeOperations, subExpressionVariable, type);
         _storeExpressionInfo(isExpression,
             isNot ? ExpressionInfo.invert(expressionInfo) : expressionInfo);
       }
  
positive.code:     _expressionWithInfo = expression;
      _expressionInfo = expressionInfo;
      _current = expressionInfo.after;
    }
  }
  
  
negative.code:       // but weak mode it might produce an "equal" result.  We don't want flow
        // analysis behavior to depend on mode, so we conservatively assume that
        // either result is possible.
      } else if (lhsInfo is _NullInfo<Variable, Type> && rhsVariable != null) {
        assert(
            leftOperandTypeClassification == TypeClassification.nullOrEquivalent);
        ExpressionInfo<Variable, Type> equalityInfo =
            _current.tryMarkNonNullable(typeOperations, rhsVariable);
        _storeExpressionInfo(wholeExpression,
            notEqual ? equalityInfo : ExpressionInfo.invert(equalityInfo));
      } else if (rhsInfo is _NullInfo<Variable, Type> && lhsVariable != null) {
        ExpressionInfo<Variable, Type> equalityInfo =
            _current.tryMarkNonNullable(typeOperations, lhsVariable);
        _storeExpressionInfo(wholeExpression,
            notEqual ? equalityInfo : ExpressionInfo.invert(equalityInfo));
      }
  