Buggy code:
if ( element != null ) { if ( reference instanceof FieldReference ) { reportDeclaration ( ( ( FieldReference ) ( reference ) ) . binding , locator , declPattern . knownFields ) ; } else if ( reference instanceof QualifiedNameReference ) { QualifiedNameReference qNameRef = ( ( QualifiedNameReference ) ( reference ) ) ; Binding nameBinding = qNameRef . binding ; if ( nameBinding instanceof FieldBinding ) reportDeclaration ( ( ( FieldBinding ) ( nameBinding ) ) , locator , declPattern . knownFields ) ; int otherMax = ( ( qNameRef . otherBindings ) == null ) ? 0 : qNameRef . otherBindings . length ; for ( int i = 0 ; i < otherMax ; i ++ ) reportDeclaration ( qNameRef . otherBindings [ i ] , locator , declPattern . knownFields ) ; } else if ( reference instanceof SingleNameReference ) { reportDeclaration ( ( ( FieldBinding ) ( ( ( SingleNameReference ) ( reference ) ) . binding ) ) , locator , declPattern . knownFields ) ; } } } else if ( reference instanceof ImportReference ) { ImportReference importRef = ( ( ImportReference ) ( reference ) ) ; long [ ] positions = importRef . sourcePositions ; int lastIndex = ( importRef . tokens . length ) - 1 ; int start = ( ( int ) ( ( positions [ lastIndex ] ) > > > 32 ) ) ; int end = ( ( int ) ( positions [ lastIndex ] ) ) ; match = locator . newFieldReferenceMatch ( element , elementBinding , accuracy , start , ( ( end - start ) + 1 ) , importRef ) ; locator . report ( match ) ; } else if ( reference instanceof FieldReference ) { FieldReference fieldReference = ( ( FieldReference ) ( reference ) ) ; long position = fieldReference . nameSourcePosition ; int start = ( ( int ) ( position > > > 32 ) ) ; int end = ( ( int ) ( position ) ) ; match = locator . newFieldReferenceMatch ( element , elementBinding , accuracy , start , ( ( end - start ) + 1 ) , fieldReference ) ; locator . report ( match ) ; } else if ( reference instanceof SingleNameReference ) { int offset = reference . sourceStart ; match = locator . newFieldReferenceMatch ( element , elementBinding , accuracy , offset , ( ( ( reference . sourceEnd ) - offset ) + 1 ) , reference ) ; locator . report ( match ) ; } else if ( reference instanceof QualifiedNameReference ) { QualifiedNameReference qNameRef = ( ( QualifiedNameReference ) ( reference ) ) ; int length = qNameRef . tokens . length ; SearchMatch [ ] matches = new SearchMatch [ length ] ; Binding nameBinding = qNameRef . binding ; int indexOfFirstFieldBinding = ( ( qNameRef . indexOfFirstFieldBinding ) > 0 ) ? ( qNameRef . indexOfFirstFieldBinding ) - 1 : 0 ; if ( ( matchesName ( this . pattern . name , qNameRef . tokens [ indexOfFirstFieldBinding ] ) ) && ( ! ( nameBinding instanceof LocalVariableBinding ) ) ) { FieldBinding fieldBinding = ( nameBinding instanceof FieldBinding ) ? ( ( FieldBinding ) ( nameBinding ) ) : null ; if ( fieldBinding == null ) { matches [ indexOfFirstFieldBinding ] = locator . newFieldReferenceMatch ( element , elementBinding , accuracy , ( - 1 ) , ( - 1 ) , reference ) ; } else { switch ( matchField ( fieldBinding , false ) ) { case PatternLocator . ACCURATE_MATCH : matches [ indexOfFirstFieldBinding ] = locator . newFieldReferenceMatch ( element , elementBinding , SearchMatch . A_ACCURATE , ( - 1 ) , ( - 1 ) , reference ) ; break ; case PatternLocator . INACCURATE_MATCH : match = locator . newFieldReferenceMatch ( element , elementBinding , SearchMatch . A_INACCURATE , ( - 1 ) , ( - 1 ) , reference ) ; <START_BUG> if ( ( fieldBinding . type . isParameterizedType ( ) ) && ( this . pattern . hasTypeArguments ( ) ) ) { <END_BUG> updateMatch ( ( ( ParameterizedTypeBinding ) ( fieldBinding . type ) ) , this . pattern . getTypeArguments ( ) , locator ) ; } matches [ indexOfFirstFieldBinding ] = match ; break ; } } } for ( int i = indexOfFirstFieldBinding + 1 ; i < length ; i ++ ) { char [ ] token = qNameRef . tokens [ i ] ; if ( matchesName ( this . pattern . name , token ) ) { FieldBinding otherBinding = ( ( qNameRef . otherBindings ) == null ) ? null : qNameRef . otherBindings [ ( i - ( indexOfFirstFieldBinding + 1 ) ) ] ; if ( otherBinding == null ) { matches [ i ] = locator . newFieldReferenceMatch ( element , elementBinding , accuracy , ( - 1 ) , ( - 1 ) , reference ) ; } else { switch ( matchField ( otherBinding , false ) ) { case PatternLocator . ACCURATE_MATCH : matches [ i ] = locator . newFieldReferenceMatch ( element , elementBinding , SearchMatch . A_ACCURATE , ( - 1 ) , ( - 1 ) , reference ) ; break ; case PatternLocator . INACCURATE_MATCH : match = locator . newFieldReferenceMatch ( element , elementBinding , SearchMatch . A_INACCURATE , ( - 1 ) , ( - 1 ) , reference ) ; if ( ( otherBinding . type . isParameterizedType ( ) ) && ( this . pattern . hasTypeArguments ( ) ) ) { updateMatch ( ( ( ParameterizedTypeBinding ) ( otherBinding . type ) ) , this . pattern . getTypeArguments ( ) , locator ) ; } matches [ indexOfFirstFieldBinding ] = match ; break ; } }

Fix:
if ( ( ( ( fieldBinding . type ) != null ) && ( fieldBinding . type . isParameterizedType ( ) ) ) && ( this . pattern . hasTypeArguments ( ) ) ) {