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 e336a607e966..8d845ff3023e 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 @@ -31,6 +31,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Stack; +import com.siyeh.ig.numeric.UnnecessaryExplicitNumericCastInspection; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -1874,7 +1875,13 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { final PsiTypeElement typeElement = castExpression.getCastType(); if (typeElement != null && operand != null) { - addInstruction(new TypeCastInstruction(castExpression, operand, typeElement.getType())); + if (typeElement.getType() instanceof PsiPrimitiveType && + UnnecessaryExplicitNumericCastInspection.isPrimitiveNumericCastNecessary(castExpression)) { + addInstruction(new PopInstruction()); + pushUnknown(); + } else { + addInstruction(new TypeCastInstruction(castExpression, operand, typeElement.getType())); + } } finishElement(castExpression); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java b/java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java new file mode 100644 index 000000000000..652f0dccc9d6 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/PrimitiveCastMayChangeValue.java @@ -0,0 +1,15 @@ + +public class BrokenAlignment { + private static void foo(long value) { + if (value == (byte)value) { + System.out.println("1"); + } else if (value == (short)value) { + System.out.println("2"); + } else if (value == (int)value) { + System.out.println("3"); + } else { + System.out.println("4"); + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 02dcfc0072b3..30993c07b4ac 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -122,6 +122,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { } public void testPreserveNullableOnUncheckedCast() throws Throwable { doTest(); } + public void testPrimitiveCastMayChangeValue() throws Throwable { doTest(); } public void testPassingNullableIntoVararg() throws Throwable { doTest(); } public void testEqualsImpliesNotNull() throws Throwable { doTest(); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/UnnecessaryExplicitNumericCastInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/UnnecessaryExplicitNumericCastInspection.java index e8bf9a978aff..f7eeccffb09d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/UnnecessaryExplicitNumericCastInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/UnnecessaryExplicitNumericCastInspection.java @@ -140,7 +140,7 @@ public class UnnecessaryExplicitNumericCastInspection extends BaseInspection { } } - static boolean isPrimitiveNumericCastNecessary(PsiTypeCastExpression expression) { + public static boolean isPrimitiveNumericCastNecessary(PsiTypeCastExpression expression) { final PsiType castType = expression.getType(); if (castType == null) { return true;