Program: 27557
Project: 27557
Buggy source:
private void checkSuperProperty(RawNominalType current,NominalType superType,String pname,Multimap<String,DeclaredFunctionType> propMethodTypesToProcess,Multimap<String,JSType> propTypesToProcess){
  JSType inheritedPropType=superType.getPropDeclaredType(pname);
  if (inheritedPropType == null) {
    return;
  }
  Collection<PropertyDef> inheritedPropDefs;
  if (superType.isInterface()) {
    inheritedPropDefs=getPropDefsFromInterface(superType,pname);
  }
 else {
    inheritedPropDefs=ImmutableSet.of(getPropDefFromClass(superType,pname));
  }
  if (superType.isInterface() && current.isClass() && !current.mayHaveProp(pname)) {
    warnings.add(JSError.make(inheritedPropDefs.iterator().next().defSite,TypeValidator.INTERFACE_METHOD_NOT_IMPLEMENTED,pname,superType.toString(),current.toString()));
    return;
  }
  PropertyDef localPropDef=propertyDefs.get(current,pname);
  JSType localPropType=localPropDef == null ? null : current.getInstancePropDeclaredType(pname);
  if (localPropDef != null && superType.isClass() && localPropType.getFunType() != null && superType.hasConstantProp(pname)) {
    warnings.add(JSError.make(localPropDef.defSite,CANNOT_OVERRIDE_FINAL_METHOD,pname));
    return;
  }
  if (localPropType == null) {
    propTypesToProcess.put(pname,inheritedPropType);
  }
 else   if (!localPropType.isSubtypeOf(inheritedPropType)) {
    warnings.add(JSError.make(localPropDef.defSite,INVALID_PROP_OVERRIDE,pname,inheritedPropType.toString(),localPropType.toString()));
  }
 else   if (localPropDef.methodType != null) {
    for (    PropertyDef inheritedPropDef : inheritedPropDefs) {
      if (inheritedPropDef.methodType != null) {
        propMethodTypesToProcess.put(pname,inheritedPropDef.methodType);
      }
    }
  }
}

Fixed version (ground truth):
private void checkSuperProperty(RawNominalType current,NominalType superType,String pname,Multimap<String,DeclaredFunctionType> propMethodTypesToProcess,Multimap<String,JSType> propTypesToProcess){
  JSType inheritedPropType=superType.getPropDeclaredType(pname);
  if (inheritedPropType == null) {
    return;
  }
  Collection<PropertyDef> inheritedPropDefs;
  if (superType.isInterface()) {
    inheritedPropDefs=getPropDefsFromInterface(superType,pname);
  }
 else {
    inheritedPropDefs=ImmutableSet.of(getPropDefFromClass(superType,pname));
  }
  if (superType.isInterface() && current.isClass() && !current.mayHaveProp(pname)) {
    warnings.add(JSError.make(inheritedPropDefs.iterator().next().defSite,TypeValidator.INTERFACE_METHOD_NOT_IMPLEMENTED,pname,superType.toString(),current.toString()));
    return;
  }
  PropertyDef localPropDef=propertyDefs.get(current,pname);
  JSType localPropType=localPropDef == null ? null : current.getInstancePropDeclaredType(pname);
  if (localPropDef != null && superType.isClass() && localPropType.getFunType() != null && superType.hasConstantProp(pname)) {
    warnings.add(JSError.make(localPropDef.defSite,CANNOT_OVERRIDE_FINAL_METHOD,pname));
    return;
  }
  if (localPropType == null) {
    propTypesToProcess.put(pname,inheritedPropType);
  }
 else   if (!localPropType.isSubtypeOf(inheritedPropType)) {
    warnings.add(JSError.make(localPropDef.defSite,INVALID_PROP_OVERRIDE,pname,inheritedPropType.toString(),localPropType.toString()));
  }
 else   if (localPropDef.methodType != null) {
    for (    PropertyDef inheritedPropDef : inheritedPropDefs) {
      if (inheritedPropDef.methodType != null) {
        propMethodTypesToProcess.put(pname,inheritedPropDef.methodType.substituteNominalGenerics(superType));
      }
    }
  }
}