From 7fdfffcc0b6caaf75953fb312dc4d7a38ba6bfd2 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 25 Jun 2020 18:04:16 +0700 Subject: [PATCH] IDEA-244356 Constant condition incorrect when declaring a list of integers with wildcard GitOrigin-RevId: 0fad4814936b86fcf361f0245be66b98483a7959 --- .../dataFlow/ControlFlowAnalyzer.java | 6 ++++-- .../ImplicitUnboxingExtendsInteger.java | 21 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/ImplicitUnboxingExtendsInteger.java 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(); }