anchor.diff:      _typeVariables[parameter] = value;
     }
   
  -  void addVariableValue(VariableDeclaration variable, Constant value) {
  -    _variables[variable] = value;
  +  void updateVariableValue(VariableDeclaration variable, Constant value) {
  +    if (!_variables.containsKey(variable)) {
  +      _variables[variable] = new EvaluationReference(value);
  +    } else {
  +      _variables[variable].value = value;
  +    }
       if (value is UnevaluatedConstant) {
         _unreadUnevaluatedVariables.add(variable);
       }
     }
   
     Constant lookupVariable(VariableDeclaration variable) {
  -    Constant value = _variables[variable];
  +    Constant value = _variables[variable]?.value;
       if (value is UnevaluatedConstant) {
         _unreadUnevaluatedVariables.remove(variable);
       }
  
positive.code:             // TODO(johnniwinther): This should call [_evaluateSubexpression].
              : _evaluateNullableSubexpression(parameter.initializer);
          if (value is AbortConstant) return value;
          env.addVariableValue(parameter, value);
        }
        for (final VariableDeclaration parameter in function.namedParameters) {
          final Constant value = namedArguments[parameter.name] ??
              // TODO(johnniwinther): This should call [_evaluateSubexpression].
              _evaluateNullableSubexpression(parameter.initializer);
          if (value is AbortConstant) return value;
          env.addVariableValue(parameter, value);
        }
        Statement body = function.body;
        if (body is ReturnStatement) {
  
negative.code:   Iterable<UnevaluatedConstant> get unevaluatedUnreadConstants {
      if (_unreadUnevaluatedVariables.isEmpty) return const [];
      return _unreadUnevaluatedVariables.map<UnevaluatedConstant>(
          (VariableDeclaration variable) => _variables[variable].value);
    }
  
    DartType substituteType(DartType type) {
  