Buggy code:
class MethodVerifier15 extends MethodVerifier { MethodVerifier15 ( LookupEnvironment environment ) { } boolean areMethodsEqual ( MethodBinding one , MethodBinding two ) { } boolean areParametersEqual ( MethodBinding one , MethodBinding two ) { } boolean areReturnTypesEqual ( MethodBinding one , MethodBinding substituteTwo ) { } boolean areTypesEqual ( TypeBinding one , TypeBinding two ) { } boolean canSkipInheritedMethods ( ) { } boolean canSkipInheritedMethods ( MethodBinding one , MethodBinding two ) { } void checkConcreteInheritedMethod ( MethodBinding concreteMethod , MethodBinding [ ] abstractMethods ) { } void checkForBridgeMethod ( MethodBinding currentMethod , MethodBinding inheritedMethod , MethodBinding [ ] allInheritedMethods ) { } void checkForInheritedNameClash ( MethodBinding inheritedMethod , MethodBinding otherInheritedMethod ) { } void checkForNameClash ( MethodBinding currentMethod , MethodBinding inheritedMethod ) { } void checkInheritedMethods ( MethodBinding [ ] methods , int length ) { } boolean checkInheritedReturnTypes ( MethodBinding [ ] methods , int length ) { } 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 ; MethodBinding [ ] matchingInherited = new MethodBinding [ inherited . length ] ; byte [ ] foundMatch = new byte [ inherited . length ] ; if ( current != null ) { for ( int i = 0 , length1 = current . length ; i < length1 ; i ++ ) { MethodBinding currentMethod = current [ i ] ; for ( int j = 0 , length2 = inherited . length ; j < length2 ; j ++ ) { MethodBinding inheritedMethod = computeSubstituteMethod ( inherited [ j ] , currentMethod ) ; if ( inheritedMethod != null ) { if ( ( ( foundMatch [ j ] ) == 0 ) && ( doesSubstituteMethodOverride ( currentMethod , inheritedMethod ) ) ) { matchingInherited [ ( ++ index ) ] = inheritedMethod ; foundMatch [ j ] = 1 ; } else { checkForNameClash ( currentMethod , inheritedMethod ) ; } } } if ( index >= 0 ) { <START_BUG> if ( currentMethod . declaringClass . isInterface ( ) ) <END_BUG> checkInheritedReturnTypes ( matchingInherited , ( index + 1 ) ) ; checkAgainstInheritedMethods ( currentMethod , matchingInherited , ( index + 1 ) , inherited ) ; while ( index >= 0 ) matchingInherited [ ( index -- ) ] = null ; } } } for ( int i = 0 , length = inherited . length ; i < length ; i ++ ) { if ( ( foundMatch [ i ] ) == 1 ) continue ; MethodBinding inheritedMethod = inherited [ i ] ; matchingInherited [ ( ++ index ) ] = inheritedMethod ; for ( int j = i + 1 ; j < length ; j ++ ) { MethodBinding otherInheritedMethod = inherited [ j ] ; if ( ( ( foundMatch [ j ] ) == 1 ) || ( canSkipInheritedMethods ( inheritedMethod , otherInheritedMethod ) ) ) continue ; otherInheritedMethod = computeSubstituteMethod ( otherInheritedMethod , inheritedMethod ) ; if ( otherInheritedMethod != null ) { if ( doesSubstituteMethodOverride ( inheritedMethod , otherInheritedMethod ) ) { matchingInherited [ ( ++ index ) ] = otherInheritedMethod ; foundMatch [ j ] = 1 ; } else { checkForInheritedNameClash ( inheritedMethod , otherInheritedMethod ) ; } } } if ( index == ( - 1 ) ) continue ; if ( index > 0 ) checkInheritedMethods ( matchingInherited , ( index + 1 ) ) ; else if ( ( mustImplementAbstractMethods && ( index == 0 ) ) && ( matchingInherited [ 0 ] . isAbstract ( ) ) ) checkAbstractMethod ( matchingInherited [ 0 ] ) ; while ( index >= 0 ) matchingInherited [ ( index -- ) ] = null ; } } } void checkTypeVariableMethods ( ) { } MethodBinding computeSubstituteMethod ( MethodBinding inheritedMethod , MethodBinding currentMethod ) { } boolean detectInheritedMethodClash ( MethodBinding inherited , MethodBinding otherInherited ) { } boolean detectNameClash ( MethodBinding current , MethodBinding inherited ) { } public boolean doesMethodOverride ( MethodBinding method , MethodBinding inheritedMethod ) { } boolean doesSubstituteMethodOverride ( MethodBinding method , MethodBinding substituteMethod ) { } boolean doParametersClash ( MethodBinding one , MethodBinding substituteTwo ) { } boolean doTypeVariablesClash ( MethodBinding one , MethodBinding substituteTwo ) { } boolean isInterfaceMethodImplemented ( MethodBinding inheritedMethod , MethodBinding existingMethod , ReferenceBinding superType ) { } void verify ( SourceTypeBinding someType ) { } }

Fix:
if ( ( index > 0 ) && ( currentMethod . declaringClass . isInterface ( ) ) )