Buggy code:
public static final int CLASS_LITERAL_EMUL = 2 ; public static final int RECEIVER_TYPE_EMUL = 3 ; HashMap [ ] synthetics ; char [ ] genericReferenceTypeSignature ; public SourceTypeBinding ( char [ ] [ ] compoundName , PackageBinding fPackage , ClassScope scope ) { } private void addDefaultAbstractMethod ( MethodBinding abstractMethod ) { } public void addDefaultAbstractMethods ( ) { } public FieldBinding addSyntheticFieldForInnerclass ( LocalVariableBinding actualOuterLocalVariable ) { } public FieldBinding addSyntheticFieldForInnerclass ( ReferenceBinding enclosingType ) { } public FieldBinding addSyntheticFieldForClassLiteral ( TypeBinding targetType , BlockScope blockScope ) { } public FieldBinding addSyntheticFieldForAssert ( BlockScope blockScope ) { } public FieldBinding addSyntheticFieldForEnumValues ( ) { } public SyntheticMethodBinding addSyntheticMethod ( FieldBinding targetField , boolean isReadAccess ) { } public SyntheticMethodBinding addSyntheticEnumMethod ( char [ ] selector ) { } public SyntheticMethodBinding addSyntheticMethod ( MethodBinding targetMethod , boolean isSuperAccess ) { } public SyntheticMethodBinding addSyntheticBridgeMethod ( MethodBinding inheritedMethodToBridge , MethodBinding targetMethod ) { } public void collectSubstitutes ( Scope currentScope , TypeBinding otherType , Map substitutes , int constraint ) { } public int kind ( ) { } public char [ ] computeUniqueKey ( ) { } void faultInTypesForFieldsAndMethods ( ) { } public FieldBinding [ ] fields ( ) { } public char [ ] genericTypeSignature ( ) { } public char [ ] genericSignature ( ) { } public long getAnnotationTagBits ( ) { } public MethodBinding [ ] getDefaultAbstractMethods ( ) { } public MethodBinding getExactConstructor ( TypeBinding [ ] argumentTypes ) { } public MethodBinding getExactMethod ( char [ ] selector , TypeBinding [ ] argumentTypes , CompilationUnitScope refScope ) { } public FieldBinding getField ( char [ ] fieldName , boolean needResolve ) { } public MethodBinding [ ] getMethods ( char [ ] selector ) { } public FieldBinding getSyntheticField ( LocalVariableBinding actualOuterLocalVariable ) { } public FieldBinding getSyntheticField ( ReferenceBinding targetEnclosingType , boolean onlyExactMatch ) { } public SyntheticMethodBinding getSyntheticBridgeMethod ( MethodBinding inheritedMethodToBridge ) { } public boolean isEquivalentTo ( TypeBinding otherType ) { } public boolean isGenericType ( ) { } public ReferenceBinding [ ] memberTypes ( ) { } public FieldBinding getUpdatedFieldBinding ( FieldBinding targetField , ReferenceBinding newDeclaringClass ) { } public MethodBinding getUpdatedMethodBinding ( MethodBinding targetMethod , ReferenceBinding newDeclaringClass ) { } public boolean hasMemberTypes ( ) { } public MethodBinding [ ] methods ( ) { if ( ( ( tagBits ) & ( AreMethodsComplete ) ) != 0 ) return methods ; int failed = 0 ; try { boolean isViewedAsDeprecated = isViewedAsDeprecated ( ) ; boolean complyTo15 = ( fPackage . environment . options . sourceLevel ) >= ( ClassFileConstants . JDK1_5 ) ; for ( int i = 0 , length = methods . length ; i < length ; i ++ ) { MethodBinding method = methods [ i ] ; if ( complyTo15 ) { if ( ( ( method . getAnnotationTagBits ( ) ) & ( AnnotationDeprecated ) ) != 0 ) method . modifiers |= AccDeprecated ; else if ( ( ( method . modifiers ) & ( AccDeprecated ) ) != 0 ) scope . problemReporter ( ) . missingDeprecatedAnnotationForMethod ( method . sourceMethod ( ) ) ; } if ( isViewedAsDeprecated && ( ! ( method . isDeprecated ( ) ) ) ) method . modifiers |= AccDeprecatedImplicitly ; if ( ( resolveTypesFor ( method ) ) == null ) { methods [ i ] = null ; failed ++ ; } } for ( int i = 0 , length = methods . length ; i < length ; i ++ ) { MethodBinding method = methods [ i ] ; if ( method != null ) { AbstractMethodDeclaration methodDecl = null ; for ( int j = length - 1 ; j > i ; j -- ) { MethodBinding method2 = methods [ j ] ; if ( ( method2 != null ) && ( CharOperation . equals ( method . selector , method2 . selector ) ) ) { <START_BUG> boolean paramsMatch = ( complyTo15 && ( ( method . returnType ) == ( method2 . returnType ) ) ) ? method . areParameterErasuresEqual ( method2 ) : method . areParametersEqual ( method2 ) ; <END_BUG> if ( paramsMatch ) { boolean isEnumSpecialMethod = ( isEnum ( ) ) && ( ( ( method . selector ) == ( TypeConstants . VALUEOF ) ) || ( ( method . selector ) == ( TypeConstants . VALUES ) ) ) ; if ( methodDecl == null ) { methodDecl = method . sourceMethod ( ) ; if ( ( methodDecl != null ) && ( ( methodDecl . binding ) != null ) ) { if ( isEnumSpecialMethod ) scope . problemReporter ( ) . duplicateEnumSpecialMethod ( this , methodDecl ) ; else scope . problemReporter ( ) . duplicateMethodInType ( this , methodDecl ) ; methodDecl . binding = null ; methods [ i ] = null ; failed ++ ; } } AbstractMethodDeclaration method2Decl = method2 . sourceMethod ( ) ; if ( ( method2Decl != null ) && ( ( method2Decl . binding ) != null ) ) { if ( isEnumSpecialMethod ) scope . problemReporter ( ) . duplicateEnumSpecialMethod ( this , method2Decl ) ; else scope . problemReporter ( ) . duplicateMethodInType ( this , method2Decl ) ; method2Decl . binding = null ; methods [ j ] = null ; failed ++ ; } } } } if ( ( ( method . returnType ) == null ) && ( methodDecl == null ) ) { method . sourceMethod ( ) . binding = null ; methods [ i ] = null ; failed ++ ; } } } } finally { if ( failed > 0 ) { int newSize = ( methods . length ) - failed ; if ( newSize == 0 ) { methods = NoMethods ; } else { MethodBinding [ ] newMethods = new MethodBinding [ newSize ] ;

Fix:
boolean paramsMatch = ( complyTo15 && ( ( method . returnType . erasure ( ) ) == ( method2 . returnType . erasure ( ) ) ) ) ? method . areParameterErasuresEqual ( method2 ) : method . areParametersEqual ( method2 ) ;