Buggy code:
public class ForStatement extends Statement { public Statement [ ] initializations ; public Expression condition ; public Statement [ ] increments ; public Statement action ; public boolean neededScope ; public BlockScope scope ; private Label breakLabel ; private Label continueLabel ; int preCondInitStateIndex = - 1 ; int condIfTrueInitStateIndex = - 1 ; int mergedInitStateIndex = - 1 ; public ForStatement ( Statement [ ] initializations , Expression condition , Statement [ ] increments , Statement action , boolean neededScope , int s , int e ) { } public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { breakLabel = new Label ( ) ; continueLabel = new Label ( ) ; if ( ( initializations ) != null ) { int count = initializations . length ; int i = 0 ; while ( i < count ) { flowInfo = initializations [ ( i ++ ) ] . analyseCode ( scope , flowContext , flowInfo ) ; } } preCondInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( flowInfo ) ; Constant cst = ( ( this . condition ) == null ) ? null : this . condition . constant ; boolean isConditionTrue = ( cst == null ) || ( ( cst != ( NotAConstant ) ) && ( ( cst . booleanValue ( ) ) == true ) ) ; boolean isConditionFalse = ( cst != null ) && ( ( cst != ( NotAConstant ) ) && ( ( cst . booleanValue ( ) ) == false ) ) ; cst = ( ( this . condition ) == null ) ? null : this . condition . optimizedBooleanConstant ( ) ; boolean isConditionOptimizedTrue = ( cst == null ) || ( ( cst != ( NotAConstant ) ) && ( ( cst . booleanValue ( ) ) == true ) ) ; boolean isConditionOptimizedFalse = ( cst != null ) && ( ( cst != ( NotAConstant ) ) && ( ( cst . booleanValue ( ) ) == false ) ) ; LoopingFlowContext condLoopContext = null ; if ( ( condition ) != null ) { if ( ! isConditionTrue ) { flowInfo = condition . analyseCode ( scope , ( condLoopContext = new LoopingFlowContext ( flowContext , this , null , null , scope ) ) , flowInfo ) ; } } LoopingFlowContext loopingContext ; FlowInfo actionInfo ; if ( ( ( action ) == null ) || ( ( action . isEmptyBlock ( ) ) && ( ( currentScope . environment ( ) . options . complianceLevel ) <= ( JDK1_3 ) ) ) ) { if ( condLoopContext != null ) condLoopContext . complainOnFinalAssignmentsInLoop ( scope , flowInfo ) ; if ( isConditionTrue ) { return FlowInfo . DEAD_END ; } else { if ( isConditionFalse ) { continueLabel = null ; } actionInfo = flowInfo . initsWhenTrue ( ) . copy ( ) ; loopingContext = new LoopingFlowContext ( flowContext , this , breakLabel , continueLabel , scope ) ; } } else { loopingContext = new LoopingFlowContext ( flowContext , this , breakLabel , continueLabel , scope ) ; FlowInfo initsWhenTrue = flowInfo . initsWhenTrue ( ) ; condIfTrueInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( initsWhenTrue ) ; if ( isConditionFalse ) { actionInfo = FlowInfo . DEAD_END ; } else { actionInfo = initsWhenTrue . copy ( ) ; if ( isConditionOptimizedFalse ) { actionInfo . setReachMode ( FlowInfo . UNREACHABLE ) ; } } if ( ! ( actionInfo . complainIfUnreachable ( action , scope , false ) ) ) { actionInfo = action . analyseCode ( scope , loopingContext , actionInfo ) ; } if ( ( ! ( actionInfo . isReachable ( ) ) ) && ( ! ( loopingContext . initsOnContinue . isReachable ( ) ) ) ) { continueLabel = null ; } else { if ( condLoopContext != null ) condLoopContext . complainOnFinalAssignmentsInLoop ( scope , flowInfo ) ; loopingContext . complainOnFinalAssignmentsInLoop ( scope , actionInfo ) ; actionInfo = actionInfo . mergedWith ( loopingContext . initsOnContinue . unconditionalInits ( ) ) ; } } if ( ( ( continueLabel ) != null ) && ( ( increments ) != null ) ) { LoopingFlowContext loopContext = new LoopingFlowContext ( flowContext , this , null , null , scope ) ; int i = 0 ; int count = increments . length ; while ( i < count ) actionInfo = increments [ ( i ++ ) ] . analyseCode ( scope , loopContext , actionInfo ) ; <START_BUG> loopContext . complainOnFinalAssignmentsInLoop ( scope , flowInfo ) ; <END_BUG> } FlowInfo mergedInfo ; if ( isConditionOptimizedTrue ) { mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( ( mergedInfo = loopingContext . initsOnBreak ) ) ; return mergedInfo ; } mergedInfo = flowInfo . initsWhenFalse ( ) . unconditionalInits ( ) . mergedWith ( loopingContext . initsOnBreak . unconditionalInits ( ) ) ; if ( isConditionOptimizedTrue && ( ( continueLabel ) == null ) ) { mergedInfo . setReachMode ( FlowInfo . UNREACHABLE ) ; } mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( mergedInfo ) ; return mergedInfo ; } public void generateCode ( BlockScope currentScope , CodeStream codeStream ) { } public void resetStateForCodeGeneration ( ) { } public void resolve ( BlockScope upperScope ) { } public String toString ( int tab ) { } public void traverse ( IAbstractSyntaxTreeVisitor visitor , BlockScope blockScope ) { } }

Fix:
loopContext . complainOnFinalAssignmentsInLoop ( scope , actionInfo ) ;