Program: 72886
Project: 72886
Buggy source:
/** 
 * Return a new token whose value is the value of the argument token subtracted from the value of this token.   Type conversion also occurs here, so that the operation is performed at the least type necessary to ensure precision.  The returned type is the same as the type chosen for the operation.  Generally, this is higher of the type of this token and the argument type.  Subclasses should not override this method, but override the protected _subtract() method to ensure that type conversion is performed consistently.
 * @param rightArgument The token to subtract from this token.
 * @return A new token containing the result.
 * @exception IllegalActionException If the argument token andthis token are of incomparable types, or the operation does not make sense for the given types.
 */
public final Token subtract(Token rightArgument) throws IllegalActionException {
  int typeInfo=TypeLattice.compare(getType(),rightArgument);
  if (typeInfo == CPO.SAME) {
    Token result=_subtract(rightArgument);
    return result;
  }
 else   if (typeInfo == CPO.HIGHER) {
    AbstractConvertibleToken convertedArgument=(AbstractConvertibleToken)getType().convert(rightArgument);
    try {
      Token result=_subtract(convertedArgument);
      return result;
    }
 catch (    IllegalActionException ex) {
      throw new IllegalActionException(null,ex,notSupportedMessage("String_Node_Str",this,rightArgument));
    }
  }
 else   if (typeInfo == CPO.LOWER) {
    Token result=rightArgument.subtractReverse(this);
    return result;
  }
 else {
    throw new IllegalActionException(notSupportedIncomparableMessage("String_Node_Str",this,rightArgument));
  }
}

Fixed version (ground truth):
/** 
 * Return a new token whose value is the value of the argument token subtracted from the value of this token.   Type conversion also occurs here, so that the operation is performed at the least type necessary to ensure precision.  The returned type is the same as the type chosen for the operation.  Generally, this is higher of the type of this token and the argument type.  Subclasses should not override this method, but override the protected _subtract() method to ensure that type conversion is performed consistently.
 * @param rightArgument The token to subtract from this token.
 * @return A new token containing the result.
 * @exception IllegalActionException If the argument token andthis token are of incomparable types, or the operation does not make sense for the given types.
 */
public final Token subtract(Token rightArgument) throws IllegalActionException {
  int typeInfo=TypeLattice.compare(getType(),rightArgument);
  if (typeInfo == CPO.SAME) {
    Token result=_subtract(rightArgument);
    return result;
  }
 else   if (typeInfo == CPO.HIGHER) {
    AbstractConvertibleToken convertedArgument=(AbstractConvertibleToken)getType().convert(rightArgument);
    Token result=_subtract(convertedArgument);
    return result;
  }
 else   if (typeInfo == CPO.LOWER) {
    Token result=rightArgument.subtractReverse(this);
    return result;
  }
 else {
    throw new IllegalActionException(notSupportedIncomparableMessage("String_Node_Str",this,rightArgument));
  }
}