Buggy code:
public class BinaryExpression extends OperatorExpression { public Expression left ; public Expression right ; public Constant optimizedBooleanConstant ; public BinaryExpression ( Expression left , Expression right , int operator ) { } public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { } public void computeConstant ( BlockScope scope , int leftId , int rightId ) { } public Constant optimizedBooleanConstant ( ) { } public void generateCode ( BlockScope currentScope , CodeStream codeStream , boolean valueRequired ) { } public void generateOptimizedBoolean ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedGreaterThan ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedGreaterThanOrEqual ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedLessThan ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedLessThanOrEqual ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedLogicalAnd ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedLogicalOr ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedLogicalXor ( BlockScope currentScope , CodeStream codeStream , Label trueLabel , Label falseLabel , boolean valueRequired ) { } public void generateOptimizedStringBuffer ( BlockScope blockScope , CodeStream codeStream , int typeID ) { } public void generateOptimizedStringBufferCreation ( BlockScope blockScope , CodeStream codeStream , int typeID ) { } public boolean isCompactableOperation ( ) { } public void optimizedBooleanConstant ( int leftId , int operator , int rightId ) { } public StringBuffer printExpressionNoParenthesis ( int indent , StringBuffer output ) { } public TypeBinding resolveType ( BlockScope scope ) { boolean argsContainCast = false ; if ( ( left ) instanceof CastExpression ) { left . bits |= IgnoreNeedForCastCheckMASK ; argsContainCast = true ; } TypeBinding leftType = left . resolveType ( scope ) ; if ( ( right ) instanceof CastExpression ) { right . bits |= IgnoreNeedForCastCheckMASK ; argsContainCast = true ; } TypeBinding rightType = right . resolveType ( scope ) ; if ( ( leftType == null ) || ( rightType == null ) ) { constant = Constant . NotAConstant ; return null ; } int leftTypeId = leftType . id ; int rightTypeId = rightType . id ; if ( ( leftTypeId > 15 ) || ( rightTypeId > 15 ) ) { if ( leftTypeId == ( T_String ) ) { rightTypeId = T_Object ; } else if ( rightTypeId == ( T_String ) ) { leftTypeId = T_Object ; } else { constant = Constant . NotAConstant ; scope . problemReporter ( ) . invalidOperator ( this , leftType , rightType ) ; return null ; } } if ( ( ( ( bits ) & ( ASTNode . OperatorMASK ) ) > > ( ASTNode . OperatorSHIFT ) ) == ( OperatorIds . PLUS ) ) { if ( ( ( leftTypeId == ( T_String ) ) && ( rightType . isArrayType ( ) ) ) && ( ( ( ( ArrayBinding ) ( rightType ) ) . elementsType ( scope ) ) == ( CharBinding ) ) ) { scope . problemReporter ( ) . signalNoImplicitStringConversionForCharArrayExpression ( right ) ; } else if ( ( ( rightTypeId == ( T_String ) ) && ( leftType . isArrayType ( ) ) ) && ( ( ( ( ArrayBinding ) ( leftType ) ) . elementsType ( scope ) ) == ( CharBinding ) ) ) { scope . problemReporter ( ) . signalNoImplicitStringConversionForCharArrayExpression ( left ) ; } } int operator = ( ( bits ) & ( ASTNode . OperatorMASK ) ) > > ( ASTNode . OperatorSHIFT ) ; <START_BUG> int operatorSignature = ResolveTypeTables [ operator ] [ ( ( leftTypeId << 4 ) + rightTypeId ) ] ; <END_BUG> left . implicitConversion = operatorSignature > > > 12 ; right . implicitConversion = ( operatorSignature > > > 4 ) & 255 ; bits |= operatorSignature & 15 ; switch ( operatorSignature & 15 ) { case TypeIds . T_boolean : this . resolvedType = BooleanBinding ; break ; case TypeIds . T_byte : this . resolvedType = ByteBinding ; break ; case TypeIds . T_char : this . resolvedType = CharBinding ; break ; case TypeIds . T_double : this . resolvedType = DoubleBinding ; break ; case TypeIds . T_float : this . resolvedType = FloatBinding ; break ; case TypeIds . T_int : this . resolvedType = IntBinding ; break ; case TypeIds . T_long : this . resolvedType = LongBinding ; break ; case T_String : this . resolvedType = scope . getJavaLangString ( ) ; break ; default : constant = Constant . NotAConstant ; scope . problemReporter ( ) . invalidOperator ( this , leftType , rightType ) ; return null ; } if ( argsContainCast ) { CastExpression . checkNeedForArgumentCasts ( scope , operator , operatorSignature , left , leftTypeId , right , rightTypeId ) ; } computeConstant ( scope , leftTypeId , rightTypeId ) ; return this . resolvedType ; } public void traverse ( IAbstractSyntaxTreeVisitor visitor , BlockScope scope ) { } }

Fix:
int operatorSignature = OperatorExpression . OperatorSignatures [ operator ] [ ( ( leftTypeId << 4 ) + rightTypeId ) ] ;