From 23630af7b58a76a3d9882b4e876ba75ae4cd71c7 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 26 Jul 2018 11:27:01 +0700 Subject: [PATCH] ControlFlowAnalyzer: Enable math evaluation in for loop initializer Fixes IDEA-195855 Incorrect NPE warning in reversed indexed for loop --- .../codeInspection/dataFlow/ControlFlowAnalyzer.java | 6 +++++- .../inspection/dataFlow/fixture/LongRangeBasics.java | 12 ++++++++++++ 2 files changed, 17 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 e3c0f5f08396..6713b7eeb980 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 @@ -1388,7 +1388,11 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { if (parent instanceof PsiBinaryExpression && RelationType.fromElementType(((PsiBinaryExpression)parent).getOperationTokenType()) != null) { return true; } - if (parent instanceof PsiLoopStatement) return false; + if (parent instanceof PsiLoopStatement && + !(parent instanceof PsiForStatement && + PsiTreeUtil.isAncestor(((PsiForStatement)parent).getInitialization(), expression, false))) { + return false; + } parent = parent.getParent(); } return true; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeBasics.java b/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeBasics.java index e9f2e9d81c82..8ab2b4b36734 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeBasics.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/LongRangeBasics.java @@ -202,4 +202,16 @@ public class LongRangeBasics { System.out.println(s2.trim()); } } + + void testLoopInitializer(List l) { + int count = l != null ? l.size() : 0; + for (int i = count - 1; i >= 0; i--) { + try { + Object o = l.get(i); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } }