Buggy code:
protected final MethodBinding mostSpecificMethodBinding ( MethodBinding [ ] visible , int visibleSize , TypeBinding [ ] argumentTypes , InvocationSite invocationSite , ReferenceBinding receiverType ) { int [ ] compatibilityLevels = new int [ visibleSize ] ; for ( int i = 0 ; i < visibleSize ; i ++ ) compatibilityLevels [ i ] = parameterCompatibilityLevel ( visible [ i ] , argumentTypes ) ; boolean useTiebreakMethod = ( invocationSite . genericTypeArguments ( ) ) == null ; MethodBinding [ ] moreSpecific = new MethodBinding [ visibleSize ] ; int count = 0 ; for ( int level = 0 , max = Scope . VARARGS_COMPATIBLE ; level <= max ; level ++ ) { nextVisible : for ( int i = 0 ; i < visibleSize ; i ++ ) { if ( ( compatibilityLevels [ i ] ) != level ) continue nextVisible ; max = level ; MethodBinding current = visible [ i ] ; MethodBinding original = current . original ( ) ; MethodBinding tiebreakMethod = ( useTiebreakMethod ) ? current . tiebreakMethod ( ) : current ; for ( int j = 0 ; j < visibleSize ; j ++ ) { if ( ( i == j ) || ( ( compatibilityLevels [ j ] ) != level ) ) continue ; MethodBinding next = visible [ j ] ; if ( original == ( next . original ( ) ) ) { compatibilityLevels [ j ] = - 1 ; continue ; } MethodBinding methodToTest = next ; if ( next instanceof ParameterizedGenericMethodBinding ) { ParameterizedGenericMethodBinding pNext = ( ( ParameterizedGenericMethodBinding ) ( next ) ) ; if ( pNext . isRaw ) { } else { methodToTest = pNext . originalMethod ; } } MethodBinding acceptable = computeCompatibleMethod ( methodToTest , tiebreakMethod . parameters , invocationSite ) ; if ( ( acceptable == null ) || ( ! ( acceptable . isValidBinding ( ) ) ) ) continue nextVisible ; if ( ! ( isAcceptableMethod ( tiebreakMethod , acceptable ) ) ) continue nextVisible ; } moreSpecific [ i ] = current ; count ++ ; } } if ( count == 1 ) { for ( int i = 0 ; i < visibleSize ; i ++ ) { if ( ( moreSpecific [ i ] ) != null ) { compilationUnitScope ( ) . recordTypeReferences ( visible [ i ] . thrownExceptions ) ; return visible [ i ] ; } } } else if ( count == 0 ) { return new ProblemMethodBinding ( visible [ 0 ] . selector , visible [ 0 ] . parameters , ProblemReasons . Ambiguous ) ; } if ( receiverType != null ) receiverType = ( receiverType instanceof CaptureBinding ) ? receiverType : ( ( ReferenceBinding ) ( receiverType . erasure ( ) ) ) ; nextSpecific : for ( int i = 0 ; i < visibleSize ; i ++ ) { MethodBinding current = moreSpecific [ i ] ; if ( current != null ) { MethodBinding original = current . original ( ) ; for ( int j = 0 ; j < visibleSize ; j ++ ) { MethodBinding next = moreSpecific [ j ] ; if ( ( next == null ) || ( i == j ) ) continue ; MethodBinding original2 = next . original ( ) ; if ( ( original . declaringClass ) == ( original2 . declaringClass ) ) break nextSpecific ; if ( ! ( original . isAbstract ( ) ) ) { if ( original2 . isAbstract ( ) ) continue ; TypeBinding superType = original . declaringClass . findSuperTypeWithSameErasure ( original2 . declaringClass . erasure ( ) ) ; if ( superType == null ) continue nextSpecific ; <START_BUG> if ( current != original ) { <END_BUG> if ( ( original2 . declaringClass ) != superType ) { MethodBinding [ ] superMethods = ( ( ReferenceBinding ) ( superType ) ) . getMethods ( original2 . selector ) ; for ( int m = 0 , l = superMethods . length ; m < l ; m ++ ) { if ( ( superMethods [ m ] . original ( ) ) == original2 ) { original2 = superMethods [ m ] ; break ; } } } if ( ( original . typeVariables ) != ( Binding . NO_TYPE_VARIABLES ) ) original2 = original . computeSubstitutedMethod ( original2 , environment ( ) ) ; if ( ( original2 == null ) || ( ! ( original . areParametersEqual ( original2 ) ) ) ) continue nextSpecific ; } } else if ( receiverType != null ) { TypeBinding superType = receiverType . findSuperTypeWithSameErasure ( original . declaringClass . erasure ( ) ) ; if ( ( ( original . declaringClass ) == superType ) || ( ! ( superType instanceof ReferenceBinding ) ) ) { } else { MethodBinding [ ] superMethods = ( ( ReferenceBinding ) ( superType ) ) . getMethods ( original . selector ) ; for ( int m = 0 , l = superMethods . length ; m < l ; m ++ ) { if ( ( superMethods [ m ] . original ( ) ) == original ) { original = superMethods [ m ] ; break ; } } } superType = receiverType . findSuperTypeWithSameErasure ( original2 . declaringClass . erasure ( ) ) ; if ( ( ( original2 . declaringClass ) == superType ) || ( ! ( superType instanceof ReferenceBinding ) ) ) { } else { MethodBinding [ ] superMethods = ( ( ReferenceBinding ) ( superType ) ) . getMethods ( original2 . selector ) ; for ( int m = 0 , l = superMethods . length ; m < l ; m ++ ) { if ( ( superMethods [ m ] . original ( ) ) == original2 ) { original2 = superMethods [ m ] ; break ; }

Fix:
if ( ( current . hasSubstitutedParameters ( ) ) || ( ( original . typeVariables ) != ( Binding . NO_TYPE_VARIABLES ) ) ) {