Buggy code:
public class CombinedBinaryExpression extends BinaryExpression { public int arity ; public int arityMax ; public static final int ARITY_MAX_MAX = 160 ; public static final int ARITY_MAX_MIN = 20 ; public static int defaultArityMaxStartingValue = CombinedBinaryExpression . ARITY_MAX_MIN ; public BinaryExpression [ ] referencesTable ; public CombinedBinaryExpression ( Expression left , Expression right , int operator , int arity ) { } public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { } public void generateOptimizedStringConcatenation ( BlockScope blockScope , CodeStream codeStream , int typeID ) { } public void generateOptimizedStringConcatenationCreation ( BlockScope blockScope , CodeStream codeStream , int typeID ) { if ( ( this . referencesTable ) == null ) { super . generateOptimizedStringConcatenationCreation ( blockScope , codeStream , typeID ) ; } else { if ( ( ( ( ( ( this . bits ) & ( ASTNode . OperatorMASK ) ) > > ( ASTNode . OperatorSHIFT ) ) == ( OperatorIds . PLUS ) ) && ( ( ( this . bits ) & ( ASTNode . ReturnTypeIDMASK ) ) == ( TypeIds . T_JavaLangString ) ) ) && ( ( this . constant ) == ( Constant . NotAConstant ) ) ) { int pc = codeStream . position ; BinaryExpression cursor = this . referencesTable [ ( ( this . arity ) - 1 ) ] ; int restart = 0 ; for ( restart = ( this . arity ) - 1 ; restart >= 0 ; restart -- ) { if ( ( ( ( ( ( cursor = this . referencesTable [ restart ] ) . bits ) & ( ASTNode . OperatorMASK ) ) > > ( ASTNode . OperatorSHIFT ) ) == ( OperatorIds . PLUS ) ) && ( ( ( cursor . bits ) & ( ASTNode . ReturnTypeIDMASK ) ) == ( TypeIds . T_JavaLangString ) ) ) { if ( ( cursor . constant ) != ( Constant . NotAConstant ) ) { codeStream . newStringContatenation ( ) ; codeStream . dup ( ) ; codeStream . ldc ( cursor . constant . stringValue ( ) ) ; codeStream . invokeStringConcatenationStringConstructor ( ) ; break ; } } else { cursor . generateOptimizedStringConcatenationCreation ( blockScope , codeStream , ( ( cursor . implicitConversion ) & ( TypeIds . COMPILE_TYPE_MASK ) ) ) ; break ; } } restart ++ ; if ( restart == 0 ) { <START_BUG> cursor . left . generateOptimizedStringConcatenationCreation ( blockScope , codeStream , ( ( this . left . implicitConversion ) & ( TypeIds . COMPILE_TYPE_MASK ) ) ) ; <END_BUG> } int pcAux ; for ( int i = restart ; i < ( this . arity ) ; i ++ ) { codeStream . recordPositionsFrom ( pc , ( cursor = this . referencesTable [ i ] ) . left . sourceStart ) ; pcAux = codeStream . position ; cursor . right . generateOptimizedStringConcatenation ( blockScope , codeStream , ( ( cursor . right . implicitConversion ) & ( TypeIds . COMPILE_TYPE_MASK ) ) ) ; codeStream . recordPositionsFrom ( pcAux , cursor . right . sourceStart ) ; } codeStream . recordPositionsFrom ( pc , this . left . sourceStart ) ; pc = codeStream . position ; this . right . generateOptimizedStringConcatenation ( blockScope , codeStream , ( ( this . right . implicitConversion ) & ( TypeIds . COMPILE_TYPE_MASK ) ) ) ; codeStream . recordPositionsFrom ( pc , this . right . sourceStart ) ; } else { super . generateOptimizedStringConcatenationCreation ( blockScope , codeStream , typeID ) ; } } } public StringBuffer printExpressionNoParenthesis ( int indent , StringBuffer output ) { } public TypeBinding resolveType ( BlockScope scope ) { } public void traverse ( ASTVisitor visitor , BlockScope scope ) { } public void tuneArityMax ( ) { } }

Fix:
cursor . left . generateOptimizedStringConcatenationCreation ( blockScope , codeStream , ( ( cursor . left . implicitConversion ) & ( TypeIds . COMPILE_TYPE_MASK ) ) ) ;