Buggy code:
public class IfStatement extends Statement { public Expression condition ; public Statement thenStatement ; public Statement elseStatement ; boolean thenExit ; int thenInitStateIndex = - 1 ; int elseInitStateIndex = - 1 ; int mergedInitStateIndex = - 1 ; public IfStatement ( Expression condition , Statement thenStatement , int s , int e ) { } public IfStatement ( Expression condition , Statement thenStatement , Statement elseStatement , int s , int e ) { } public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { FlowInfo thenFlowInfo ; FlowInfo elseFlowInfo ; flowInfo = condition . analyseCode ( currentScope , flowContext , flowInfo ) ; <START_BUG> Constant condConstant = this . condition . optimizedBooleanConstant ( ) ; <END_BUG> if ( ( this . thenStatement ) == null ) { thenFlowInfo = flowInfo . initsWhenTrue ( ) ; } else { thenFlowInfo = ( ( condConstant != ( NotAConstant ) ) && ( ( condConstant . booleanValue ( ) ) == false ) ) ? flowInfo . initsWhenTrue ( ) . copy ( ) . markAsFakeReachable ( true ) : flowInfo . initsWhenTrue ( ) . copy ( ) ; thenInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( thenFlowInfo ) ; if ( ! ( thenFlowInfo . complainIfUnreachable ( thenStatement , currentScope , false ) ) ) { thenFlowInfo = thenStatement . analyseCode ( currentScope , flowContext , thenFlowInfo ) ; } } this . thenExit = ( thenFlowInfo == ( DeadEnd ) ) || ( thenFlowInfo . isFakeReachable ( ) ) ; if ( ( this . elseStatement ) == null ) { elseFlowInfo = flowInfo . initsWhenFalse ( ) ; } else { elseFlowInfo = ( ( condConstant != ( NotAConstant ) ) && ( ( condConstant . booleanValue ( ) ) == true ) ) ? flowInfo . initsWhenFalse ( ) . copy ( ) . markAsFakeReachable ( true ) : flowInfo . initsWhenFalse ( ) . copy ( ) ; elseInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( elseFlowInfo ) ; if ( ! ( elseFlowInfo . complainIfUnreachable ( elseStatement , currentScope , false ) ) ) { elseFlowInfo = elseStatement . analyseCode ( currentScope , flowContext , elseFlowInfo ) ; } } FlowInfo mergedInfo ; if ( ( condConstant != ( NotAConstant ) ) && ( ( condConstant . booleanValue ( ) ) == true ) ) { if ( this . thenExit ) { mergedInfo = elseFlowInfo . markAsFakeReachable ( true ) ; mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( mergedInfo ) ; return mergedInfo ; } else { mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( thenFlowInfo ) ; return thenFlowInfo ; } } else { if ( ( condConstant != ( NotAConstant ) ) && ( ( condConstant . booleanValue ( ) ) == false ) ) { if ( ( elseFlowInfo == ( DeadEnd ) ) || ( elseFlowInfo . isFakeReachable ( ) ) ) { mergedInfo = thenFlowInfo . markAsFakeReachable ( true ) ; mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( mergedInfo ) ; return mergedInfo ; } else { mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( elseFlowInfo ) ; return elseFlowInfo ; } } } mergedInfo = thenFlowInfo . mergedWith ( elseFlowInfo . unconditionalInits ( ) ) ; mergedInitStateIndex = currentScope . methodScope ( ) . recordInitializationStates ( mergedInfo ) ; return mergedInfo ; } public void generateCode ( BlockScope currentScope , CodeStream codeStream ) { } public void resolve ( BlockScope scope ) { } public String toString ( int tab ) { } public void traverse ( IAbstractSyntaxTreeVisitor visitor , BlockScope blockScope ) { } }

Fix:
Constant condConstant = this . condition . constant ;