Buggy code:
public static final int IsSuperType = ASTNode . Bit5 ; public static final int IsVarArgs = ASTNode . Bit15 ; public static final int IgnoreRawTypeCheck = ASTNode . Bit31 ; public static final int IsAnnotationDefaultValue = ASTNode . Bit1 ; public static final int IsNonNull = ASTNode . Bit18 ; public ASTNode ( ) { } private static boolean checkInvocationArgument ( BlockScope scope , Expression argument , TypeBinding parameterType , TypeBinding argumentType , TypeBinding originalParameterType ) { } public static void checkInvocationArguments ( BlockScope scope , Expression receiver , TypeBinding receiverType , MethodBinding method , Expression [ ] arguments , TypeBinding [ ] argumentTypes , boolean argsContainCast , InvocationSite invocationSite ) { boolean unsafeWildcardInvocation = false ; TypeBinding [ ] params = method . parameters ; int paramLength = params . length ; boolean isRawMemberInvocation = ( ( ( ! ( method . isStatic ( ) ) ) && ( ! ( receiverType . isUnboundWildcard ( ) ) ) ) && ( method . declaringClass . isRawType ( ) ) ) && ( method . hasSubstitutedParameters ( ) ) ; MethodBinding rawOriginalGenericMethod = null ; if ( ! isRawMemberInvocation ) { if ( method instanceof ParameterizedGenericMethodBinding ) { ParameterizedGenericMethodBinding paramMethod = ( ( ParameterizedGenericMethodBinding ) ( method ) ) ; if ( ( paramMethod . isUnchecked ) || ( ( paramMethod . isRaw ) && ( method . hasSubstitutedParameters ( ) ) ) ) { rawOriginalGenericMethod = method . original ( ) ; } } } if ( arguments != null ) { if ( method . isVarargs ( ) ) { int lastIndex = paramLength - 1 ; for ( int i = 0 ; i < lastIndex ; i ++ ) { TypeBinding originalRawParam = ( rawOriginalGenericMethod == null ) ? null : rawOriginalGenericMethod . parameters [ i ] ; if ( ASTNode . checkInvocationArgument ( scope , arguments [ i ] , params [ i ] , argumentTypes [ i ] , originalRawParam ) ) { unsafeWildcardInvocation = true ; } } int argLength = arguments . length ; if ( lastIndex < argLength ) { TypeBinding parameterType = params [ lastIndex ] ; TypeBinding originalRawParam = null ; if ( ( paramLength != argLength ) || ( ( parameterType . dimensions ( ) ) != ( argumentTypes [ lastIndex ] . dimensions ( ) ) ) ) { parameterType = ( ( ArrayBinding ) ( parameterType ) ) . elementsType ( ) ; if ( ! ( parameterType . isReifiable ( ) ) ) { scope . problemReporter ( ) . unsafeGenericArrayForVarargs ( parameterType , ( ( ASTNode ) ( invocationSite ) ) ) ; } originalRawParam = ( rawOriginalGenericMethod == null ) ? null : ( ( ArrayBinding ) ( rawOriginalGenericMethod . parameters [ lastIndex ] ) ) . elementsType ( ) ; } for ( int i = lastIndex ; i < argLength ; i ++ ) { if ( ASTNode . checkInvocationArgument ( scope , arguments [ i ] , parameterType , argumentTypes [ i ] , originalRawParam ) ) unsafeWildcardInvocation = true ; } } if ( paramLength == ( argumentTypes . length ) ) { int varargsIndex = paramLength - 1 ; ArrayBinding varargsType = ( ( ArrayBinding ) ( params [ varargsIndex ] ) ) ; TypeBinding lastArgType = argumentTypes [ varargsIndex ] ; int dimensions ; if ( lastArgType == ( TypeBinding . NULL ) ) { if ( ! ( ( varargsType . leafComponentType ( ) . isBaseType ( ) ) && ( ( varargsType . dimensions ( ) ) == 1 ) ) ) scope . problemReporter ( ) . varargsArgumentNeedCast ( method , lastArgType , invocationSite ) ; } else if ( ( varargsType . dimensions ) <= ( dimensions = lastArgType . dimensions ( ) ) ) { if ( lastArgType . leafComponentType ( ) . isBaseType ( ) ) { dimensions -- ; } if ( ( varargsType . dimensions ) < dimensions ) { scope . problemReporter ( ) . varargsArgumentNeedCast ( method , lastArgType , invocationSite ) ; } else <START_BUG> if ( ( ( ( varargsType . dimensions ) == dimensions ) && ( ( varargsType . leafComponentType ) != ( lastArgType . leafComponentType ( ) ) ) ) && ( lastArgType . isCompatibleWith ( varargsType ) ) ) { <END_BUG> scope . problemReporter ( ) . varargsArgumentNeedCast ( method , lastArgType , invocationSite ) ; } } } } else { for ( int i = 0 ; i < paramLength ; i ++ ) { TypeBinding originalRawParam = ( rawOriginalGenericMethod == null ) ? null : rawOriginalGenericMethod . parameters [ i ] ; if ( ASTNode . checkInvocationArgument ( scope , arguments [ i ] , params [ i ] , argumentTypes [ i ] , originalRawParam ) ) unsafeWildcardInvocation = true ; } } if ( argsContainCast ) { CastExpression . checkNeedForArgumentCasts ( scope , receiver , receiverType , method , arguments , argumentTypes , invocationSite ) ; } } if ( unsafeWildcardInvocation ) { scope . problemReporter ( ) . wildcardInvocation ( ( ( ASTNode ) ( invocationSite ) ) , receiverType , method , argumentTypes ) ; } else if ( ( ( ( ! ( method . isStatic ( ) ) ) && ( ! ( receiverType . isUnboundWildcard ( ) ) ) ) && ( method . declaringClass . isRawType ( ) ) ) && ( method . hasSubstitutedParameters ( ) ) ) { scope . problemReporter ( ) . unsafeRawInvocation ( ( ( ASTNode ) ( invocationSite ) ) , method ) ; } else if ( rawOriginalGenericMethod != null ) { scope . problemReporter ( ) . unsafeRawGenericMethodInvocation ( ( ( ASTNode ) ( invocationSite ) ) , method ) ; } } public ASTNode concreteStatement ( ) { } public final boolean isFieldUseDeprecated ( FieldBinding field , Scope scope , boolean isStrictlyAssigned ) { } public boolean isImplicitThis ( ) { }

Fix:
if ( ( ( ( varargsType . dimensions ) == dimensions ) && ( ( varargsType . leafComponentType . erasure ( ) ) != ( lastArgType . leafComponentType ( ) . erasure ( ) ) ) ) && ( lastArgType . isCompatibleWith ( varargsType ) ) ) {