Program: 25770
Project: 25770
Buggy source:
public void atExpr(Expr expr) throws CompileError {
  int token=expr.getOperator();
  ASTree oprand=expr.oprand1();
  if (token == '.') {
    String member=((Symbol)expr.oprand2()).get();
    if (member.equals("String_Node_Str"))     atArrayLength(expr);
 else     if (member.equals("String_Node_Str"))     atClassObject(expr);
 else     atFieldRead(expr);
  }
 else   if (token == MEMBER) {
    atFieldRead(expr);
  }
 else   if (token == ARRAY)   atArrayRead(oprand,expr.oprand2());
 else   if (token == PLUSPLUS || token == MINUSMINUS)   atPlusPlus(token,oprand,expr,true);
 else   if (token == '!') {
    booleanExpr(false,expr);
    bytecode.addIndex(7);
    bytecode.addIconst(1);
    bytecode.addOpcode(Opcode.GOTO);
    bytecode.addIndex(4);
    bytecode.addIconst(0);
  }
 else   if (token == CALL)   fatal();
 else {
    expr.oprand1().accept(this);
    int type=typePrecedence(exprType);
    if (arrayDim > 0)     badType(expr);
    if (token == '-') {
      if (type == P_DOUBLE)       bytecode.addOpcode(DNEG);
 else       if (type == P_FLOAT)       bytecode.addOpcode(FNEG);
 else       if (type == P_LONG)       bytecode.addOpcode(LNEG);
 else       if (type == P_INT) {
        bytecode.addOpcode(INEG);
        exprType=INT;
      }
 else       badType(expr);
    }
 else     if (token == '~') {
      if (type == P_INT) {
        bytecode.addIconst(-1);
        bytecode.addOpcode(IXOR);
        exprType=INT;
      }
 else       if (type == P_LONG) {
        bytecode.addLconst(-1);
        bytecode.addOpcode(LXOR);
      }
 else       badType(expr);
    }
 else     if (token == '+') {
      if (type == P_OTHER)       badType(expr);
    }
 else     fatal();
  }
}

Fixed version (ground truth):
public void atExpr(Expr expr) throws CompileError {
  int token=expr.getOperator();
  ASTree oprand=expr.oprand1();
  if (token == '.') {
    String member=((Symbol)expr.oprand2()).get();
    if (member.equals("String_Node_Str"))     atClassObject(expr);
 else     atFieldRead(expr);
  }
 else   if (token == MEMBER) {
    atFieldRead(expr);
  }
 else   if (token == ARRAY)   atArrayRead(oprand,expr.oprand2());
 else   if (token == PLUSPLUS || token == MINUSMINUS)   atPlusPlus(token,oprand,expr,true);
 else   if (token == '!') {
    booleanExpr(false,expr);
    bytecode.addIndex(7);
    bytecode.addIconst(1);
    bytecode.addOpcode(Opcode.GOTO);
    bytecode.addIndex(4);
    bytecode.addIconst(0);
  }
 else   if (token == CALL)   fatal();
 else {
    expr.oprand1().accept(this);
    int type=typePrecedence(exprType);
    if (arrayDim > 0)     badType(expr);
    if (token == '-') {
      if (type == P_DOUBLE)       bytecode.addOpcode(DNEG);
 else       if (type == P_FLOAT)       bytecode.addOpcode(FNEG);
 else       if (type == P_LONG)       bytecode.addOpcode(LNEG);
 else       if (type == P_INT) {
        bytecode.addOpcode(INEG);
        exprType=INT;
      }
 else       badType(expr);
    }
 else     if (token == '~') {
      if (type == P_INT) {
        bytecode.addIconst(-1);
        bytecode.addOpcode(IXOR);
        exprType=INT;
      }
 else       if (type == P_LONG) {
        bytecode.addLconst(-1);
        bytecode.addOpcode(LXOR);
      }
 else       badType(expr);
    }
 else     if (token == '+') {
      if (type == P_OTHER)       badType(expr);
    }
 else     fatal();
  }
}