Buggy code:
public FieldBinding findField ( TypeBinding receiverType , char [ ] fieldName , InvocationSite invocationSite , boolean needResolve ) { } public ReferenceBinding findMemberType ( char [ ] typeName , ReferenceBinding enclosingType ) { } public MethodBinding findMethod ( ReferenceBinding receiverType , char [ ] selector , TypeBinding [ ] argumentTypes , InvocationSite invocationSite ) { } public MethodBinding findMethodForArray ( ArrayBinding receiverType , char [ ] selector , TypeBinding [ ] argumentTypes , InvocationSite invocationSite ) { } public MethodBinding findMethodInSuperInterfaces ( ReferenceBinding currentType , char [ ] selector , ObjectVector found , MethodBinding matchingMethod ) { } public ReferenceBinding findType ( char [ ] typeName , PackageBinding declarationPackage , PackageBinding invocationPackage ) { } public LocalVariableBinding findVariable ( char [ ] variable ) { } public Binding getBinding ( char [ ] name , int mask , InvocationSite invocationSite , boolean needResolve ) { } public MethodBinding getConstructor ( ReferenceBinding receiverType , TypeBinding [ ] argumentTypes , InvocationSite invocationSite ) { } public final PackageBinding getCurrentPackage ( ) { } public int getDeclarationModifiers ( ) { } public FieldBinding getField ( TypeBinding receiverType , char [ ] fieldName , InvocationSite invocationSite ) { } public MethodBinding getImplicitMethod ( char [ ] selector , TypeBinding [ ] argumentTypes , InvocationSite invocationSite ) { } public final ReferenceBinding getJavaIoSerializable ( ) { } public final ReferenceBinding getJavaLangAnnotationAnnotation ( ) { } public final ReferenceBinding getJavaLangAssertionError ( ) { } public final ReferenceBinding getJavaLangClass ( ) { } public final ReferenceBinding getJavaLangCloneable ( ) { } public final ReferenceBinding getJavaLangEnum ( ) { } public final ReferenceBinding getJavaLangIterable ( ) { } public final ReferenceBinding getJavaLangObject ( ) { } public final ReferenceBinding getJavaLangString ( ) { } public final ReferenceBinding getJavaLangThrowable ( ) { } public final ReferenceBinding getJavaUtilIterator ( ) { } public final ReferenceBinding getMemberType ( char [ ] typeName , ReferenceBinding enclosingType ) { } public MethodBinding getMethod ( TypeBinding receiverType , char [ ] selector , TypeBinding [ ] argumentTypes , InvocationSite invocationSite ) { } public final Binding getPackage ( char [ ] [ ] compoundName ) { } public final TypeBinding getType ( char [ ] name ) { } public final TypeBinding getType ( char [ ] name , PackageBinding packageBinding ) { } public final TypeBinding getType ( char [ ] [ ] compoundName , int typeNameLength ) { } final Binding getTypeOrPackage ( char [ ] name , int mask ) { } public final Binding getTypeOrPackage ( char [ ] [ ] compoundName ) { } public static TypeBinding [ ] greaterLowerBound ( TypeBinding [ ] types ) { } public static ReferenceBinding [ ] greaterLowerBound ( ReferenceBinding [ ] types ) { } public CaseStatement innermostSwitchCase ( ) { } public boolean isBoxingCompatibleWith ( TypeBinding left , TypeBinding right ) { } public final boolean isDefinedInField ( FieldBinding field ) { } public final boolean isDefinedInMethod ( MethodBinding method ) { } public final boolean isDefinedInSameUnit ( ReferenceBinding type ) { } public final boolean isDefinedInType ( ReferenceBinding type ) { } public boolean isInsideCase ( CaseStatement caseStatement ) { } public boolean isInsideDeprecatedCode ( ) { } private TypeBinding leastContainingInvocation ( TypeBinding mec , Set invocations , List lubStack ) { } private TypeBinding leastContainingTypeArgument ( TypeBinding u , TypeBinding v , ReferenceBinding genericType , int rank , List lubStack ) { } public TypeBinding lowerUpperBound ( TypeBinding [ ] types ) { } private TypeBinding lowerUpperBound ( TypeBinding [ ] types , List lubStack ) { int typeLength = types . length ; if ( typeLength == 1 ) { TypeBinding type = types [ 0 ] ; return type == null ? VoidBinding : type ; } int stackLength = lubStack . size ( ) ; nextLubCheck : for ( int i = 0 ; i < stackLength ; i ++ ) { TypeBinding [ ] lubTypes = ( ( TypeBinding [ ] ) ( lubStack . get ( i ) ) ) ; int lubTypeLength = lubTypes . length ; if ( lubTypeLength < typeLength ) continue nextLubCheck ; nextTypeCheck : for ( int j = 0 ; j < typeLength ; j ++ ) { TypeBinding type = types [ j ] ; for ( int k = 0 ; k < lubTypeLength ; k ++ ) { <START_BUG> if ( ( lubTypes [ k ] ) == type ) <END_BUG> continue nextTypeCheck ; } continue nextLubCheck ; } return IntBinding ; } lubStack . add ( types ) ; Map invocations = new HashMap ( 1 ) ; TypeBinding [ ] mecs = minimalErasedCandidates ( types , invocations ) ; if ( mecs == null ) return null ; int length = mecs . length ; if ( length == 0 ) return VoidBinding ; int count = 0 ; TypeBinding firstBound = null ; for ( int i = 0 ; i < length ; i ++ ) { TypeBinding mec = mecs [ i ] ; if ( mec == null ) continue ; mec = leastContainingInvocation ( mec , ( ( Set ) ( invocations . get ( mec ) ) ) , lubStack ) ; if ( mec == null ) return null ; if ( ! ( mec . isInterface ( ) ) ) firstBound = mec ; mecs [ ( count ++ ) ] = mec ; } switch ( count ) { case 0 : return VoidBinding ; case 1 : return mecs [ 0 ] ; case 2 : if ( ( mecs [ 1 ] . id ) == ( TypeIds . T_JavaLangObject ) ) return mecs [ 0 ] ; if ( ( mecs [ 0 ] . id ) == ( TypeIds . T_JavaLangObject ) ) return mecs [ 1 ] ; } TypeBinding [ ] otherBounds = new TypeBinding [ count - 1 ] ; int rank = 0 ;

Fix:
if ( ( ( lubTypes [ k ] ) == type ) || ( lubTypes [ k ] . isEquivalentTo ( type ) ) )