Buggy code:
public class TypeVariableBinding extends ReferenceBinding { public Binding declaringElement ; public int rank ; public TypeBinding firstBound ; public ReferenceBinding superclass ; public ReferenceBinding [ ] superInterfaces ; public char [ ] genericTypeSignature ; public TypeVariableBinding ( char [ ] sourceName , Binding declaringElement , int rank ) { } public int kind ( ) { } public int boundCheck ( Substitution substitution , TypeBinding argumentType ) { if ( ( argumentType == ( NullBinding ) ) || ( argumentType == ( this ) ) ) return OK ; boolean hasSubstitution = substitution != null ; if ( ! ( ( argumentType instanceof ReferenceBinding ) || ( argumentType . isArrayType ( ) ) ) ) return MISMATCH ; if ( ( this . superclass ) == null ) return OK ; <START_BUG> if ( argumentType . isWildcard ( ) ) { <END_BUG> WildcardBinding wildcard = ( ( WildcardBinding ) ( argumentType ) ) ; switch ( wildcard . boundKind ) { case Wildcard . EXTENDS : TypeBinding wildcardBound = wildcard . bound ; if ( wildcardBound == ( this ) ) return OK ; ReferenceBinding superclassBound = ( hasSubstitution ) ? ( ( ReferenceBinding ) ( Scope . substitute ( substitution , this . superclass ) ) ) : this . superclass ; boolean isArrayBound = wildcardBound . isArrayType ( ) ; if ( ! ( wildcardBound . isInterface ( ) ) ) { if ( ( superclassBound . id ) != ( T_JavaLangObject ) ) { if ( isArrayBound ) { if ( ! ( wildcardBound . isCompatibleWith ( superclassBound ) ) ) return MISMATCH ; } else { ReferenceBinding match = ( ( ReferenceBinding ) ( wildcardBound ) ) . findSuperTypeWithSameErasure ( superclassBound ) ; if ( match != null ) { if ( ! ( match . isIntersectingWith ( superclassBound ) ) ) { return MISMATCH ; } } else { return MISMATCH ; } } } } ReferenceBinding [ ] superInterfaceBounds = ( hasSubstitution ) ? Scope . substitute ( substitution , this . superInterfaces ) : this . superInterfaces ; int length = superInterfaceBounds . length ; boolean mustImplement = isArrayBound || ( ( ( ReferenceBinding ) ( wildcardBound ) ) . isFinal ( ) ) ; for ( int i = 0 ; i < length ; i ++ ) { TypeBinding superInterfaceBound = superInterfaceBounds [ i ] ; if ( isArrayBound ) { if ( ! ( wildcardBound . isCompatibleWith ( superInterfaceBound ) ) ) return MISMATCH ; } else { ReferenceBinding match = ( ( ReferenceBinding ) ( wildcardBound ) ) . findSuperTypeWithSameErasure ( superInterfaceBound ) ; if ( match != null ) { if ( ! ( match . isIntersectingWith ( superInterfaceBound ) ) ) { return MISMATCH ; } } else if ( mustImplement ) { return MISMATCH ; } } } break ; case Wildcard . SUPER : return boundCheck ( substitution , wildcard . bound ) ; case Wildcard . UNBOUND : break ; } return OK ; } boolean unchecked = false ; if ( ( this . superclass . id ) != ( T_JavaLangObject ) ) { TypeBinding substitutedSuperType = ( hasSubstitution ) ? Scope . substitute ( substitution , this . superclass ) : this . superclass ; if ( ! ( argumentType . isCompatibleWith ( substitutedSuperType ) ) ) { return MISMATCH ; } if ( argumentType instanceof ReferenceBinding ) { ReferenceBinding referenceArgument = ( ( ReferenceBinding ) ( argumentType ) ) ; TypeBinding match = referenceArgument . findSuperTypeWithSameErasure ( substitutedSuperType ) ; if ( match != null ) { if ( ( match . isRawType ( ) ) && ( ( substitutedSuperType . isGenericType ( ) ) || ( substitutedSuperType . isBoundParameterizedType ( ) ) ) ) unchecked = true ; } } } for ( int i = 0 , length = this . superInterfaces . length ; i < length ; i ++ ) { TypeBinding substitutedSuperType = ( hasSubstitution ) ? Scope . substitute ( substitution , this . superInterfaces [ i ] ) : this . superInterfaces [ i ] ; if ( ! ( argumentType . isCompatibleWith ( substitutedSuperType ) ) ) { return MISMATCH ; } if ( argumentType instanceof ReferenceBinding ) { ReferenceBinding referenceArgument = ( ( ReferenceBinding ) ( argumentType ) ) ; TypeBinding match = referenceArgument . findSuperTypeWithSameErasure ( substitutedSuperType ) ; if ( match != null ) { if ( ( match . isRawType ( ) ) && ( ( substitutedSuperType . isGenericType ( ) ) || ( substitutedSuperType . isBoundParameterizedType ( ) ) ) ) unchecked = true ; } } } return unchecked ? UNCHECKED : OK ; } public boolean canBeInstantiated ( ) { } public void collectSubstitutes ( Scope scope , TypeBinding otherType , Map substitutes , int constraint ) { } public char [ ] constantPoolName ( ) { } public char [ ] computeUniqueKey ( boolean isLeaf ) { } public String debugName ( ) { } public TypeBinding erasure ( ) { } public char [ ] genericSignature ( ) { } public char [ ] genericTypeSignature ( ) { } public boolean isErasureBoundTo ( TypeBinding type ) { } public boolean isInterchangeableWith ( final LookupEnvironment environment , final TypeVariableBinding otherVariable ) { } public boolean isTypeVariable ( ) { } public TypeVariableBinding original ( ) { } public char [ ] readableName ( ) { } ReferenceBinding resolve ( LookupEnvironment environment ) { } public char [ ] shortReadableName ( ) { } public ReferenceBinding superclass ( ) { } public ReferenceBinding [ ] superInterfaces ( ) { } public String toString ( ) { } public TypeBinding upperBound ( ) { } }

Fix:
if ( ( argumentType . isWildcard ( ) ) && ( ! ( argumentType . isIntersectionType ( ) ) ) ) {