Buggy code:
public final class MethodVerifier implements TagBits , TypeConstants { SourceTypeBinding type ; HashtableOfObject inheritedMethods ; HashtableOfObject currentMethods ; ReferenceBinding runtimeException ; ReferenceBinding errorException ; public MethodVerifier ( LookupEnvironment environment ) { } private void checkAgainstInheritedMethods ( MethodBinding currentMethod , MethodBinding [ ] methods , int length ) { } private void checkExceptions ( MethodBinding newMethod , MethodBinding inheritedMethod ) { } private void checkInheritedMethods ( MethodBinding [ ] methods , int length ) { } private void checkMethods ( ) { } private void computeInheritedMethods ( ) { this . inheritedMethods = new HashtableOfObject ( 51 ) ; ReferenceBinding [ ] [ ] interfacesToVisit = new ReferenceBinding [ 5 ] [ ] ; int lastPosition = 0 ; interfacesToVisit [ lastPosition ] = type . superInterfaces ( ) ; ReferenceBinding superType ; if ( this . type . isClass ( ) ) { <START_BUG> superType = this . type ; <END_BUG> } else { superType = this . type . scope . getJavaLangObject ( ) ; } MethodBinding [ ] nonVisibleDefaultMethods = null ; int nonVisibleCount = 0 ; while ( superType != null ) { if ( superType . isValidBinding ( ) ) { ReferenceBinding [ ] itsInterfaces = superType . superInterfaces ( ) ; if ( itsInterfaces != ( NoSuperInterfaces ) ) { if ( ( ++ lastPosition ) == ( interfacesToVisit . length ) ) System . arraycopy ( interfacesToVisit , 0 , ( interfacesToVisit = new ReferenceBinding [ lastPosition * 2 ] [ ] ) , 0 , lastPosition ) ; interfacesToVisit [ lastPosition ] = itsInterfaces ; } MethodBinding [ ] methods = superType . methods ( ) ; nextMethod : for ( int m = methods . length ; ( -- m ) >= 0 ; ) { MethodBinding method = methods [ m ] ; if ( ! ( ( ( method . isPrivate ( ) ) || ( method . isConstructor ( ) ) ) || ( method . isDefaultAbstract ( ) ) ) ) { MethodBinding [ ] existingMethods = ( ( MethodBinding [ ] ) ( this . inheritedMethods . get ( method . selector ) ) ) ; if ( existingMethods != null ) for ( int i = 0 , length = existingMethods . length ; i < length ; i ++ ) if ( ( method . returnType ) == ( existingMethods [ i ] . returnType ) ) if ( method . areParametersEqual ( existingMethods [ i ] ) ) continue nextMethod ; if ( nonVisibleDefaultMethods != null ) for ( int i = 0 ; i < nonVisibleCount ; i ++ ) if ( ( method . returnType ) == ( nonVisibleDefaultMethods [ i ] . returnType ) ) if ( CharOperation . equals ( method . selector , nonVisibleDefaultMethods [ i ] . selector ) ) if ( method . areParametersEqual ( nonVisibleDefaultMethods [ i ] ) ) continue nextMethod ; if ( ! ( ( method . isDefault ( ) ) && ( ( method . declaringClass . fPackage ) != ( type . fPackage ) ) ) ) { if ( existingMethods == null ) existingMethods = new MethodBinding [ 1 ] ; else System . arraycopy ( existingMethods , 0 , ( existingMethods = new MethodBinding [ ( existingMethods . length ) + 1 ] ) , 0 , ( ( existingMethods . length ) - 1 ) ) ; existingMethods [ ( ( existingMethods . length ) - 1 ) ] = method ; this . inheritedMethods . put ( method . selector , existingMethods ) ; } else { if ( nonVisibleDefaultMethods == null ) nonVisibleDefaultMethods = new MethodBinding [ 10 ] ; else if ( nonVisibleCount == ( nonVisibleDefaultMethods . length ) ) System . arraycopy ( nonVisibleDefaultMethods , 0 , ( nonVisibleDefaultMethods = new MethodBinding [ nonVisibleCount * 2 ] ) , 0 , nonVisibleCount ) ; nonVisibleDefaultMethods [ ( nonVisibleCount ++ ) ] = method ; if ( ( method . isAbstract ( ) ) && ( ! ( this . type . isAbstract ( ) ) ) ) this . problemReporter ( ) . abstractMethodCannotBeOverridden ( this . type , method ) ; MethodBinding [ ] current = ( ( MethodBinding [ ] ) ( this . currentMethods . get ( method . selector ) ) ) ; if ( current != null ) { foundMatch : for ( int i = 0 , length = current . length ; i < length ; i ++ ) { if ( ( method . returnType ) == ( current [ i ] . returnType ) ) { if ( method . areParametersEqual ( current [ i ] ) ) { this . problemReporter ( ) . overridesPackageDefaultMethod ( current [ i ] , method ) ; break foundMatch ; } } } } } } } superType = superType . superclass ( ) ; } } for ( int i = 0 ; i <= lastPosition ; i ++ ) { ReferenceBinding [ ] interfaces = interfacesToVisit [ i ] ; for ( int j = 0 , length = interfaces . length ; j < length ; j ++ ) { superType = interfaces [ j ] ; if ( ( ( superType . tagBits ) & ( InterfaceVisited ) ) == 0 ) { superType . tagBits |= InterfaceVisited ; if ( superType . isValidBinding ( ) ) { ReferenceBinding [ ] itsInterfaces = superType . superInterfaces ( ) ; if ( itsInterfaces != ( NoSuperInterfaces ) ) { if ( ( ++ lastPosition ) == ( interfacesToVisit . length ) ) System . arraycopy ( interfacesToVisit , 0 , ( interfacesToVisit = new ReferenceBinding [ lastPosition * 2 ] [ ] ) , 0 , lastPosition ) ; interfacesToVisit [ lastPosition ] = itsInterfaces ; } MethodBinding [ ] methods = superType . methods ( ) ; for ( int m = methods . length ; ( -- m ) >= 0 ;

Fix:
superType = this . type . superclass ( ) ;