Buggy code:
void checkConcreteInheritedMethod ( MethodBinding concreteMethod , MethodBinding [ ] abstractMethods ) { } void checkForBridgeMethod ( MethodBinding currentMethod , MethodBinding inheritedMethod , MethodBinding [ ] allInheritedMethods ) { } void checkForNameClash ( MethodBinding currentMethod , MethodBinding inheritedMethod ) { } void checkInheritedMethods ( MethodBinding inheritedMethod , MethodBinding otherInheritedMethod ) { } void checkInheritedMethods ( MethodBinding [ ] methods , int length ) { } boolean checkInheritedReturnTypes ( MethodBinding method , MethodBinding otherMethod ) { } void checkMethods ( ) { boolean mustImplementAbstractMethods = mustImplementAbstractMethods ( ) ; boolean skipInheritedMethods = mustImplementAbstractMethods && ( canSkipInheritedMethods ( ) ) ; char [ ] [ ] methodSelectors = this . inheritedMethods . keyTable ; nextSelector : for ( int s = methodSelectors . length ; ( -- s ) >= 0 ; ) { if ( ( methodSelectors [ s ] ) == null ) continue nextSelector ; MethodBinding [ ] current = ( ( MethodBinding [ ] ) ( this . currentMethods . get ( methodSelectors [ s ] ) ) ) ; if ( ( current == null ) && skipInheritedMethods ) continue nextSelector ; MethodBinding [ ] inherited = ( ( MethodBinding [ ] ) ( this . inheritedMethods . valueTable [ s ] ) ) ; if ( ( ( inherited . length ) == 1 ) && ( current == null ) ) { if ( mustImplementAbstractMethods && ( inherited [ 0 ] . isAbstract ( ) ) ) checkAbstractMethod ( inherited [ 0 ] ) ; continue nextSelector ; } int index = - 1 ; int inheritedLength = inherited . length ; MethodBinding [ ] matchingInherited = new MethodBinding [ inherited . length ] ; MethodBinding [ ] foundMatch = new MethodBinding [ inherited . length ] ; if ( current != null ) { for ( int i = 0 , length1 = current . length ; i < length1 ; i ++ ) { MethodBinding currentMethod = current [ i ] ; MethodBinding [ ] nonMatchingInherited = null ; for ( int j = 0 ; j < inheritedLength ; j ++ ) { MethodBinding inheritedMethod = computeSubstituteMethod ( inherited [ j ] , currentMethod ) ; if ( inheritedMethod != null ) { if ( ( ( foundMatch [ j ] ) == null ) && ( isSubstituteParameterSubsignature ( currentMethod , inheritedMethod ) ) ) { matchingInherited [ ( ++ index ) ] = inheritedMethod ; foundMatch [ j ] = currentMethod ; } else { checkForNameClash ( currentMethod , inheritedMethod ) ; if ( inheritedLength > 1 ) { if ( nonMatchingInherited == null ) nonMatchingInherited = new MethodBinding [ inheritedLength ] ; nonMatchingInherited [ j ] = inheritedMethod ; } } } } if ( index >= 0 ) { checkAgainstInheritedMethods ( currentMethod , matchingInherited , ( index + 1 ) , nonMatchingInherited ) ; while ( index >= 0 ) matchingInherited [ ( index -- ) ] = null ; } } } boolean [ ] skip = new boolean [ inheritedLength ] ; for ( int i = 0 ; i < inheritedLength ; i ++ ) { if ( skip [ i ] ) continue ; MethodBinding inheritedMethod = inherited [ i ] ; MethodBinding matchMethod = foundMatch [ i ] ; if ( matchMethod == null ) matchingInherited [ ( ++ index ) ] = inheritedMethod ; for ( int j = i + 1 ; j < inheritedLength ; j ++ ) { MethodBinding otherInheritedMethod = inherited [ j ] ; if ( ( matchMethod == ( foundMatch [ j ] ) ) && ( matchMethod != null ) ) continue ; if ( canSkipInheritedMethods ( inheritedMethod , otherInheritedMethod ) ) continue ; otherInheritedMethod = computeSubstituteMethod ( otherInheritedMethod , inheritedMethod ) ; if ( otherInheritedMethod != null ) { if ( ( ( inheritedMethod . declaringClass ) != ( otherInheritedMethod . declaringClass ) ) && ( isSubstituteParameterSubsignature ( inheritedMethod , otherInheritedMethod ) ) ) { if ( index == ( - 1 ) ) matchingInherited [ ( ++ index ) ] = inheritedMethod ; if ( ( foundMatch [ j ] ) == null ) matchingInherited [ ( ++ index ) ] = otherInheritedMethod ; skip [ j ] = true ; } else if ( ( matchMethod == null ) && ( ( foundMatch [ j ] ) == null ) ) { checkInheritedMethods ( inheritedMethod , otherInheritedMethod ) ; } } } if ( index == ( - 1 ) ) continue ; if ( index > 0 ) checkInheritedMethods ( matchingInherited , ( index + 1 ) ) ; else <START_BUG> if ( ( mustImplementAbstractMethods && ( matchingInherited [ 0 ] . isAbstract ( ) ) ) && ( ( foundMatch [ i ] ) == null ) ) <END_BUG> checkAbstractMethod ( matchingInherited [ 0 ] ) ; while ( index >= 0 ) matchingInherited [ ( index -- ) ] = null ; } } } void checkTypeVariableMethods ( TypeParameter typeParameter ) { } MethodBinding computeSubstituteMethod ( MethodBinding inheritedMethod , MethodBinding currentMethod ) { } boolean detectInheritedNameClash ( MethodBinding inherited , MethodBinding otherInherited ) { } boolean detectNameClash ( MethodBinding current , MethodBinding inherited ) { } public boolean doesMethodOverride ( MethodBinding method , MethodBinding inheritedMethod ) { } boolean doTypeVariablesClash ( MethodBinding one , MethodBinding substituteTwo ) { } SimpleSet findSuperinterfaceCollisions ( ReferenceBinding superclass , ReferenceBinding [ ] superInterfaces ) { } boolean hasGenericParameter ( MethodBinding method ) { } boolean isAcceptableReturnTypeOverride ( MethodBinding currentMethod , MethodBinding inheritedMethod ) { } boolean isInterfaceMethodImplemented ( MethodBinding inheritedMethod , MethodBinding existingMethod , ReferenceBinding superType ) { } public boolean isMethodSubsignature ( MethodBinding method , MethodBinding inheritedMethod ) { } boolean isParameterSubsignature ( MethodBinding method , MethodBinding inheritedMethod ) { } boolean isSubstituteParameterSubsignature ( MethodBinding method , MethodBinding substituteMethod ) { } boolean isUnsafeReturnTypeOverride ( MethodBinding currentMethod , MethodBinding inheritedMethod ) { } boolean reportIncompatibleReturnTypeError ( MethodBinding currentMethod , MethodBinding inheritedMethod ) { } void verify ( ) { } }

Fix:
if ( ( mustImplementAbstractMethods && ( matchingInherited [ 0 ] . isAbstract ( ) ) ) && ( matchMethod == null ) )