Buggy code:
public class MethodDeclaration extends AbstractMethodDeclaration { public TypeReference returnType ; public TypeParameter [ ] typeParameters ; public MethodDeclaration ( CompilationResult compilationResult ) { } public void analyseCode ( ClassScope classScope , InitializationFlowContext initializationContext , FlowInfo flowInfo ) { if ( this . ignoreFurtherInvestigation ) return ; try { if ( ( this . binding ) == null ) return ; <START_BUG> if ( ! ( this . binding . isUsed ( ) ) ) { <END_BUG> if ( ( this . binding . isPrivate ( ) ) || ( ( ( ( this . binding . modifiers ) & ( ( ExtraCompilerModifiers . AccOverriding ) | ( ExtraCompilerModifiers . AccImplementing ) ) ) == 0 ) && ( this . binding . isOrEnclosedByPrivateType ( ) ) ) ) { if ( ! ( classScope . referenceCompilationUnit ( ) . compilationResult . hasSyntaxError ) ) { this . scope . problemReporter ( ) . unusedPrivateMethod ( this ) ; } } } if ( ( this . binding . declaringClass . isEnum ( ) ) && ( ( ( this . selector ) == ( TypeConstants . VALUES ) ) || ( ( this . selector ) == ( TypeConstants . VALUEOF ) ) ) ) return ; if ( ( this . binding . isAbstract ( ) ) || ( this . binding . isNative ( ) ) ) return ; ExceptionHandlingFlowContext methodContext = new ExceptionHandlingFlowContext ( initializationContext , this , this . binding . thrownExceptions , null , this . scope , FlowInfo . DEAD_END ) ; if ( ( this . arguments ) != null ) { for ( int i = 0 , count = this . arguments . length ; i < count ; i ++ ) { flowInfo . markAsDefinitelyAssigned ( this . arguments [ i ] . binding ) ; } } if ( ( this . statements ) != null ) { int complaintLevel = ( ( ( flowInfo . reachMode ( ) ) & ( FlowInfo . UNREACHABLE ) ) == 0 ) ? Statement . NOT_COMPLAINED : Statement . COMPLAINED_FAKE_REACHABLE ; for ( int i = 0 , count = this . statements . length ; i < count ; i ++ ) { Statement stat = this . statements [ i ] ; if ( ( complaintLevel = stat . complainIfUnreachable ( flowInfo , this . scope , complaintLevel ) ) < ( Statement . COMPLAINED_UNREACHABLE ) ) { flowInfo = stat . analyseCode ( this . scope , methodContext , flowInfo ) ; } } } TypeBinding returnTypeBinding = this . binding . returnType ; if ( ( returnTypeBinding == ( TypeBinding . VOID ) ) || ( isAbstract ( ) ) ) { if ( ( ( flowInfo . tagBits ) & ( FlowInfo . UNREACHABLE ) ) == 0 ) { this . bits |= ASTNode . NeedFreeReturn ; } } else { if ( flowInfo != ( FlowInfo . DEAD_END ) ) { this . scope . problemReporter ( ) . shouldReturn ( returnTypeBinding , this ) ; } } methodContext . complainIfUnusedExceptionHandlers ( this ) ; this . scope . checkUnusedParameters ( this . binding ) ; } catch ( org . eclipse . jdt . internal . compiler . problem . AbortMethod e ) { this . ignoreFurtherInvestigation = true ; } } public boolean isMethod ( ) { } public void parseStatements ( Parser parser , CompilationUnitDeclaration unit ) { } public StringBuffer printReturnType ( int indent , StringBuffer output ) { } public void resolveStatements ( ) { } public void traverse ( ASTVisitor visitor , ClassScope classScope ) { } public TypeParameter [ ] typeParameters ( ) { } }

Fix:
if ( ( ! ( this . binding . isUsed ( ) ) ) && ( ! ( this . binding . isAbstract ( ) ) ) ) {