From 1d2d9236f6366c31657db247fc0cc77e9518a2fc Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 29 Jul 2019 21:05:40 +0700 Subject: [PATCH] ControlFlowAnalyzer#generateBoxingUnboxingInstructionFor: add primitive cast after unbox when necessary Fixes IDEA-219122 False inspection result when comparing boxed values GitOrigin-RevId: c32cda24d371caacd4356cce8bdcbb40557c4ccc --- .../codeInspection/dataFlow/ControlFlowAnalyzer.java | 3 ++- .../dataFlow/fixture/NewBoxedNumberEquality.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 7aaecc0b85d0..925a8ac434fd 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1490,8 +1490,9 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { if (TypeConversionUtil.isPrimitiveAndNotNull(expectedType) && TypeConversionUtil.isPrimitiveWrapper(actualType)) { addInstruction(new UnwrapSpecialFieldInstruction(SpecialField.UNBOX)); + actualType = PsiPrimitiveType.getUnboxedType(actualType); } - else if (TypeConversionUtil.isPrimitiveAndNotNull(actualType) && TypeConversionUtil.isAssignableFromPrimitiveWrapper(expectedType)) { + if (TypeConversionUtil.isPrimitiveAndNotNull(actualType) && TypeConversionUtil.isAssignableFromPrimitiveWrapper(expectedType)) { addConditionalErrorThrow(); PsiType boxedType = ((PsiPrimitiveType)actualType).getBoxedType(context); addInstruction(new BoxingInstruction(boxedType)); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java b/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java index f9ad4ad4f102..4172599f30fe 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NewBoxedNumberEquality.java @@ -1,6 +1,16 @@ import java.util.*; class Testcase { + // IDEA-219122 + public static void boxWithCast() { + Double d = 1D; + Long l = 1L; + if (d.equals(Double.valueOf(l))) { + System.out.println("e. d: " + d + " l: " + l); + } else { + System.out.println("ne. d: " + d + " l: " + l); + } + } void intToLong() { Integer i = 2;