Program: 27999
Project: 27999
Buggy source:
/** 
 * Visits a   {@link Token#FUNCTION} node.
 * @param t The node traversal object that supplies context, such as thescope chain to use in name lookups as well as error reporting.
 * @param n The node being visited.
 */
private void visitFunction(NodeTraversal t,Node n){
  FunctionType functionType=JSType.toMaybeFunctionType(n.getJSType());
  String functionPrivateName=n.getFirstChild().getString();
  if (functionType.isConstructor()) {
    FunctionType baseConstructor=functionType.getSuperClassConstructor();
    if (baseConstructor != getNativeType(OBJECT_FUNCTION_TYPE) && baseConstructor != null && baseConstructor.isInterface() && functionType.isConstructor()) {
      compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
    }
 else {
      if (baseConstructor != getNativeType(OBJECT_FUNCTION_TYPE) && baseConstructor != null) {
        if (functionType.makesStructs() && !baseConstructor.makesStructs()) {
          compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
        }
 else         if (functionType.makesDicts() && !baseConstructor.makesDicts()) {
          compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
        }
      }
      for (      JSType baseInterface : functionType.getImplementedInterfaces()) {
        boolean badImplementedType=false;
        ObjectType baseInterfaceObj=ObjectType.cast(baseInterface);
        if (baseInterfaceObj != null) {
          FunctionType interfaceConstructor=baseInterfaceObj.getConstructor();
          if (interfaceConstructor != null && !interfaceConstructor.isInterface()) {
            badImplementedType=true;
          }
        }
 else {
          badImplementedType=true;
        }
        if (badImplementedType) {
          report(t,n,BAD_IMPLEMENTED_TYPE,functionPrivateName);
        }
      }
      validator.expectAllInterfaceProperties(t,n,functionType);
    }
  }
 else   if (functionType.isInterface()) {
    for (    ObjectType extInterface : functionType.getExtendedInterfaces()) {
      if (extInterface.getConstructor() != null && !extInterface.getConstructor().isInterface()) {
        compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
      }
    }
    if (functionType.hasImplementedInterfaces()) {
      compiler.report(t.makeError(n,CONFLICTING_IMPLEMENTED_TYPE,functionPrivateName));
    }
    if (functionType.getExtendedInterfacesCount() > 1) {
      HashMap<String,ObjectType> properties=new HashMap<String,ObjectType>();
      HashMap<String,ObjectType> currentProperties=new HashMap<String,ObjectType>();
      for (      ObjectType interfaceType : functionType.getExtendedInterfaces()) {
        currentProperties.clear();
        checkInterfaceConflictProperties(t,n,functionPrivateName,properties,currentProperties,interfaceType);
        properties.putAll(currentProperties);
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Visits a   {@link Token#FUNCTION} node.
 * @param t The node traversal object that supplies context, such as thescope chain to use in name lookups as well as error reporting.
 * @param n The node being visited.
 */
private void visitFunction(NodeTraversal t,Node n){
  FunctionType functionType=JSType.toMaybeFunctionType(n.getJSType());
  String functionPrivateName=n.getFirstChild().getString();
  if (functionType.isConstructor()) {
    FunctionType baseConstructor=functionType.getSuperClassConstructor();
    if (baseConstructor != getNativeType(OBJECT_FUNCTION_TYPE) && baseConstructor != null && baseConstructor.isInterface() && functionType.isConstructor()) {
      compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
    }
 else {
      if (baseConstructor != getNativeType(OBJECT_FUNCTION_TYPE) && baseConstructor != null) {
        if (functionType.makesStructs() && !baseConstructor.makesStructs()) {
          compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
        }
 else         if (functionType.makesDicts() && !baseConstructor.makesDicts()) {
          compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
        }
      }
      for (      JSType baseInterface : functionType.getImplementedInterfaces()) {
        boolean badImplementedType=false;
        ObjectType baseInterfaceObj=ObjectType.cast(baseInterface);
        if (baseInterfaceObj != null) {
          FunctionType interfaceConstructor=baseInterfaceObj.getConstructor();
          if (interfaceConstructor != null && !interfaceConstructor.isInterface()) {
            badImplementedType=true;
          }
        }
 else {
          badImplementedType=true;
        }
        if (badImplementedType) {
          report(t,n,BAD_IMPLEMENTED_TYPE,functionPrivateName);
        }
      }
      validator.expectAllInterfaceProperties(t,n,functionType);
    }
  }
 else   if (functionType.isInterface()) {
    for (    ObjectType extInterface : functionType.getExtendedInterfaces()) {
      if (extInterface.getConstructor() != null && !extInterface.getConstructor().isInterface()) {
        compiler.report(t.makeError(n,CONFLICTING_EXTENDED_TYPE,"String_Node_Str",functionPrivateName));
      }
    }
    if (functionType.getExtendedInterfacesCount() > 1) {
      HashMap<String,ObjectType> properties=new HashMap<String,ObjectType>();
      HashMap<String,ObjectType> currentProperties=new HashMap<String,ObjectType>();
      for (      ObjectType interfaceType : functionType.getExtendedInterfaces()) {
        currentProperties.clear();
        checkInterfaceConflictProperties(t,n,functionPrivateName,properties,currentProperties,interfaceType);
        properties.putAll(currentProperties);
      }
    }
  }
}