Program: 27089
Project: 27089
Buggy source:
/** 
 * Infers all of a function's parameters if their types aren't declared. 
 */
@SuppressWarnings("String_Node_Str") private void inferParameters(TypedScope functionScope){
  Node functionNode=functionScope.getRootNode();
  Node astParameters=functionNode.getSecondChild();
  Node iifeArgumentNode=null;
  if (NodeUtil.isInvocationTarget(functionNode)) {
    iifeArgumentNode=functionNode.getNext();
  }
  FunctionType functionType=JSType.toMaybeFunctionType(functionNode.getJSType());
  if (functionType != null) {
    Node parameterTypes=functionType.getParametersNode();
    if (parameterTypes != null) {
      Node parameterTypeNode=parameterTypes.getFirstChild();
      for (      Node astParameter : astParameters.children()) {
        if (astParameter.isDefaultValue()) {
          astParameter=astParameter.getFirstChild();
        }
        if (astParameter.isRest()) {
          astParameter=astParameter.getOnlyChild();
        }
        if (!astParameter.isName()) {
          continue;
        }
        TypedVar var=functionScope.getVar(astParameter.getString());
        checkNotNull(var);
        if (var.isTypeInferred() && var.getType() == unknownType) {
          JSType newType=null;
          if (iifeArgumentNode != null) {
            newType=iifeArgumentNode.getJSType();
          }
 else           if (parameterTypeNode != null) {
            newType=parameterTypeNode.getJSType();
          }
          if (newType != null) {
            var.setType(newType);
            astParameter.setJSType(newType);
          }
        }
        if (parameterTypeNode != null) {
          parameterTypeNode=parameterTypeNode.getNext();
        }
        if (iifeArgumentNode != null) {
          iifeArgumentNode=iifeArgumentNode.getNext();
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Infers all of a function's parameters if their types aren't declared. 
 */
@SuppressWarnings("String_Node_Str") private void inferParameters(TypedScope functionScope){
  Node functionNode=functionScope.getRootNode();
  Node astParameters=functionNode.getSecondChild();
  Node iifeArgumentNode=null;
  if (NodeUtil.isInvocationTarget(functionNode)) {
    iifeArgumentNode=functionNode.getNext();
  }
  FunctionType functionType=JSType.toMaybeFunctionType(functionNode.getJSType());
  if (functionType != null) {
    Node parameterTypes=functionType.getParametersNode();
    if (parameterTypes != null) {
      Node parameterTypeNode=parameterTypes.getFirstChild();
      for (      Node astParameter : astParameters.children()) {
        boolean isRest=false;
        if (astParameter.isDefaultValue()) {
          astParameter=astParameter.getFirstChild();
        }
        if (astParameter.isRest()) {
          astParameter=astParameter.getOnlyChild();
          isRest=true;
        }
        if (!astParameter.isName()) {
          continue;
        }
        if (iifeArgumentNode != null && iifeArgumentNode.isSpread()) {
          iifeArgumentNode=null;
        }
        TypedVar var=functionScope.getVar(astParameter.getString());
        checkNotNull(var);
        if (var.isTypeInferred() && (var.getType() == unknownType || isRest)) {
          JSType newType=null;
          if (iifeArgumentNode != null) {
            newType=iifeArgumentNode.getJSType();
          }
 else           if (parameterTypeNode != null) {
            newType=parameterTypeNode.getJSType();
          }
          if (newType != null) {
            if (isRest) {
              newType=registry.createTemplatizedType(registry.getNativeObjectType(ARRAY_TYPE),newType);
            }
            var.setType(newType);
            astParameter.setJSType(newType);
          }
        }
        if (parameterTypeNode != null) {
          parameterTypeNode=parameterTypeNode.getNext();
        }
        if (iifeArgumentNode != null) {
          iifeArgumentNode=iifeArgumentNode.getNext();
        }
      }
    }
  }
}