Program: 28131
Project: 28131
Buggy source:
/** 
 * Determines whether the given property with @const tag got reassigned
 * @param t The current traversal.
 * @param getprop The getprop node.
 */
private void checkConstantProperty(NodeTraversal t,Node getprop){
  Node parent=getprop.getParent();
  if (!(NodeUtil.isAssignmentOp(parent) && parent.getFirstChild() == getprop) && (parent.getType() != Token.INC) && (parent.getType() != Token.DEC)) {
    return;
  }
  ObjectType objectType=ObjectType.cast(dereference(getprop.getFirstChild().getJSType()));
  String propertyName=getprop.getLastChild().getString();
  if (objectType != null) {
    ObjectType oType=objectType;
    while (oType != null) {
      if (oType.hasReferenceName()) {
        if (initializedConstantProperties.containsEntry(oType.getReferenceName(),propertyName)) {
          compiler.report(t.makeError(getprop,CONST_PROPERTY_REASSIGNED_VALUE,propertyName));
          break;
        }
      }
      oType=oType.getImplicitPrototype();
    }
    JSDocInfo info=objectType.getOwnPropertyJSDocInfo(propertyName);
    if (info != null && info.isConstant() && objectType.hasReferenceName()) {
      initializedConstantProperties.put(objectType.getReferenceName(),propertyName);
    }
    if (objectType.isInstanceType()) {
      ObjectType prototype=objectType.getImplicitPrototype();
      if (prototype != null) {
        JSDocInfo prototypeInfo=prototype.getOwnPropertyJSDocInfo(propertyName);
        if (prototypeInfo != null && prototypeInfo.isConstant() && prototype.hasReferenceName()) {
          initializedConstantProperties.put(prototype.getReferenceName(),propertyName);
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Determines whether the given property with @const tag got reassigned
 * @param t The current traversal.
 * @param getprop The getprop node.
 */
private void checkConstantProperty(NodeTraversal t,Node getprop){
  Node parent=getprop.getParent();
  if (!(NodeUtil.isAssignmentOp(parent) && parent.getFirstChild() == getprop) && (parent.getType() != Token.INC) && (parent.getType() != Token.DEC)) {
    return;
  }
  ObjectType objectType=ObjectType.cast(dereference(getprop.getFirstChild().getJSType()));
  String propertyName=getprop.getLastChild().getString();
  boolean isConstant=isPropertyDeclaredConstant(objectType,propertyName);
  if (isConstant) {
    ObjectType oType=objectType;
    while (oType != null) {
      if (oType.hasReferenceName()) {
        if (initializedConstantProperties.containsEntry(oType.getReferenceName(),propertyName)) {
          compiler.report(t.makeError(getprop,CONST_PROPERTY_REASSIGNED_VALUE,propertyName));
          break;
        }
      }
      oType=oType.getImplicitPrototype();
    }
    Preconditions.checkState(objectType.hasReferenceName());
    initializedConstantProperties.put(objectType.getReferenceName(),propertyName);
    if (objectType.isInstanceType()) {
      ObjectType prototype=objectType.getImplicitPrototype();
      if (prototype != null) {
        if (prototype.hasProperty(propertyName) && prototype.hasReferenceName()) {
          initializedConstantProperties.put(prototype.getReferenceName(),propertyName);
        }
      }
    }
  }
}