fix numeric promotion for eq/ne comparisons #424
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The non-equality comparisons (
<
,<=
,>
,>=
) require numeric promotion always, but equality comparisons (==
,!=
) only require it if at least one argument is numeric type (that is, primitive but notboolean
). If both arguments are not numeric types, no numeric promotion should happen.We previously guarded against that in a naive way: the
numericPromotion()
method returned early when both operands were of the same type after unboxing. This leads to incorrect conversion in case of equality comparisons on primitive wrapper types (and may lead to NPE at runtime). This commit adds proper guard to the appropriate place.Note that there are other occurences of
numericPromotion()
which are not guarded bynumericPromotionRequired()
. These are inBinOp
and inCmp
, where on both places the operation is always numeric and so always requires numeric promotion.