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 06f843db374b..9d891cb159d9 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 @@ -1448,11 +1448,13 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { void generateBoxingUnboxingInstructionFor(@NotNull PsiExpression context, PsiType actualType, PsiType expectedType, boolean explicit) { if (PsiType.VOID.equals(expectedType)) return; - if (TypeConversionUtil.isPrimitiveAndNotNull(expectedType) && TypeConversionUtil.isAssignableFromPrimitiveWrapper(actualType)) { + if (TypeConversionUtil.isPrimitiveAndNotNull(expectedType) && + TypeConversionUtil.isAssignableFromPrimitiveWrapper(GenericsUtil.getVariableTypeByExpressionType(actualType))) { addInstruction(new UnwrapSpecialFieldInstruction(SpecialField.UNBOX)); actualType = PsiPrimitiveType.getUnboxedType(actualType); } - if (TypeConversionUtil.isPrimitiveAndNotNull(actualType) && TypeConversionUtil.isAssignableFromPrimitiveWrapper(expectedType)) { + if (TypeConversionUtil.isPrimitiveAndNotNull(actualType) && + TypeConversionUtil.isAssignableFromPrimitiveWrapper(GenericsUtil.getVariableTypeByExpressionType(expectedType))) { addConditionalErrorThrow(); PsiType boxedType = ((PsiPrimitiveType)actualType).getBoxedType(context); addInstruction(new BoxingInstruction(boxedType)); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ImplicitUnboxingExtendsInteger.java b/java/java-tests/testData/inspection/dataFlow/fixture/ImplicitUnboxingExtendsInteger.java new file mode 100644 index 000000000000..53544e3815ed --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ImplicitUnboxingExtendsInteger.java @@ -0,0 +1,21 @@ +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +// IDEA-244356 +class Usage { + + private static void exampleMethod(List listOfIntegers) { + int firstElement = listOfIntegers.get(0); + for (int element : listOfIntegers) { + if (element == firstElement) {} + } + } + + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add(0); + list.add(1); + exampleMethod(list); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index e120d2c04e84..e55422829c88 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -624,6 +624,7 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testNewBoxedNumberEquality() { doTest(); } public void testBoxingIncorrectLiteral() { doTest(); } public void testImplicitUnboxingOnCast() { doTest(); } + public void testImplicitUnboxingExtendsInteger() { doTest(); } public void testIncompleteArrayAccessInLoop() { doTest(); } public void testSameArguments() { doTest(); }