Buggy code:
public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { } public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo , boolean valueRequired ) { } public TypeBinding checkFieldAccess ( BlockScope scope ) { } public void computeConversion ( Scope scope , TypeBinding runtimeTimeType , TypeBinding compileTimeType ) { } public void generateAssignment ( BlockScope currentScope , CodeStream codeStream , Assignment assignment , boolean valueRequired ) { } public void generateCode ( BlockScope currentScope , CodeStream codeStream , boolean valueRequired ) { } public void generateCompoundAssignment ( BlockScope currentScope , CodeStream codeStream , Expression expression , int operator , int assignmentImplicitConversion , boolean valueRequired ) { } public void generatePostIncrement ( BlockScope currentScope , CodeStream codeStream , CompoundAssignment postIncrement , boolean valueRequired ) { } public FieldBinding generateReadSequence ( BlockScope currentScope , CodeStream codeStream ) { } public void generateReceiver ( CodeStream codeStream ) { } public TypeBinding [ ] genericTypeArguments ( ) { } protected FieldBinding getCodegenBinding ( int index ) { } protected TypeBinding getGenericCast ( int index ) { } public TypeBinding getOtherFieldBindings ( BlockScope scope ) { int length = tokens . length ; FieldBinding field ; if ( ( ( bits ) & ( Binding . FIELD ) ) != 0 ) { field = ( ( FieldBinding ) ( this . binding ) ) ; if ( ! ( field . isStatic ( ) ) ) { if ( ( ( indexOfFirstFieldBinding ) > 1 ) || ( scope . methodScope ( ) . isStatic ) ) { scope . problemReporter ( ) . staticFieldAccessToNonStaticVariable ( this , field ) ; return null ; } } else { if ( ( ( indexOfFirstFieldBinding ) > 1 ) && ( ( field . declaringClass ) != ( actualReceiverType ) ) ) { scope . problemReporter ( ) . indirectAccessToStaticField ( this , field ) ; } } if ( isFieldUseDeprecated ( field , scope , ( ( ( ( this . bits ) & ( IsStrictlyAssignedMASK ) ) != 0 ) && ( ( indexOfFirstFieldBinding ) == length ) ) ) ) scope . problemReporter ( ) . deprecatedField ( field , this ) ; } else { field = null ; } TypeBinding type = ( ( VariableBinding ) ( binding ) ) . type ; int index = indexOfFirstFieldBinding ; if ( index == length ) { this . constant = FieldReference . getConstantFor ( ( ( FieldBinding ) ( binding ) ) , this , false , scope ) ; return ( type != null ) && ( ( ( this . bits ) & ( IsStrictlyAssignedMASK ) ) == 0 ) ? type . capture ( scope , this . sourceEnd ) : type ; } int otherBindingsLength = length - index ; otherCodegenBindings = otherBindings = new FieldBinding [ otherBindingsLength ] ; otherDepths = new int [ otherBindingsLength ] ; this . constant = ( field != null ) ? FieldReference . getConstantFor ( ( ( FieldBinding ) ( binding ) ) , this , false , scope ) : ( ( VariableBinding ) ( binding ) ) . constant ( ) ; int firstDepth = ( ( bits ) & ( ASTNode . DepthMASK ) ) > > ( ASTNode . DepthSHIFT ) ; while ( index < length ) { char [ ] token = tokens [ index ] ; if ( type == null ) return null ; bits &= ~ ( ASTNode . DepthMASK ) ; FieldBinding previousField = field ; field = scope . getField ( type . capture ( scope , ( ( int ) ( this . sourcePositions [ index ] ) ) ) , token , this ) ; int place = index - ( indexOfFirstFieldBinding ) ; otherBindings [ place ] = field ; otherDepths [ place ] = ( ( bits ) & ( ASTNode . DepthMASK ) ) > > ( ASTNode . DepthSHIFT ) ; if ( field . isValidBinding ( ) ) { if ( previousField != null ) { TypeBinding fieldReceiverType = type ; TypeBinding receiverErasure = type . erasure ( ) ; if ( receiverErasure instanceof ReferenceBinding ) { <START_BUG> ReferenceBinding match = ( ( ReferenceBinding ) ( receiverErasure ) ) . findSuperTypeErasingTo ( ( ( ReferenceBinding ) ( field . declaringClass . erasure ( ) ) ) ) ; <END_BUG> if ( match == null ) { fieldReceiverType = field . declaringClass ; } } FieldBinding originalBinding = previousField . original ( ) ; if ( ( ( ( originalBinding . type . tagBits ) & ( TagBits . HasTypeVariable ) ) != 0 ) && ( ( fieldReceiverType . id ) != ( TypeIds . T_JavaLangObject ) ) ) { setGenericCast ( ( index - 1 ) , originalBinding . type . genericCast ( fieldReceiverType ) ) ; } } if ( isFieldUseDeprecated ( field , scope , ( ( ( ( this . bits ) & ( IsStrictlyAssignedMASK ) ) != 0 ) && ( ( index + 1 ) == length ) ) ) ) { scope . problemReporter ( ) . deprecatedField ( field , this ) ; } Constant someConstant = FieldReference . getConstantFor ( field , this , false , scope ) ; if ( ( this . constant ) != ( NotAConstant ) ) { this . constant = someConstant ; } if ( field . isStatic ( ) ) { scope . problemReporter ( ) . nonStaticAccessToStaticField ( this , field ) ; if ( ( field . declaringClass ) != type ) { scope . problemReporter ( ) . indirectAccessToStaticField ( this , field ) ; } } type = field . type ; index ++ ; } else { constant = NotAConstant ; scope . problemReporter ( ) . invalidField ( this , field , index , type ) ; setDepth ( firstDepth ) ; return null ; }

Fix:
ReferenceBinding match = ( ( ReferenceBinding ) ( receiverErasure ) ) . findSuperTypeWithSameErasure ( field . declaringClass ) ;