diff --git a/java/java-impl/src/com/intellij/codeInspection/IdempotentLoopBodyInspection.java b/java/java-impl/src/com/intellij/codeInspection/IdempotentLoopBodyInspection.java index 1942eed9faaa..d5320c7bb103 100644 --- a/java/java-impl/src/com/intellij/codeInspection/IdempotentLoopBodyInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/IdempotentLoopBodyInspection.java @@ -63,7 +63,8 @@ public class IdempotentLoopBodyInspection extends AbstractBaseJavaLocalInspectio Collection variables = ControlFlowUtil.getWrittenVariables(bodyFlow, 0, bodyFlow.getSize(), true); if (variables.isEmpty()) return; List reads = ControlFlowUtil.getReadBeforeWrite(bodyFlow); - if (StreamEx.of(reads).map(PsiReferenceExpression::resolve).select(PsiVariable.class).noneMatch(variables::contains)) { + if (StreamEx.of(reads).map(PsiReferenceExpression::resolve).select(PsiVariable.class) + .noneMatch(v -> v.hasModifierProperty(PsiModifier.VOLATILE) || variables.contains(v))) { holder.registerProblem(loop.getFirstChild(), JavaBundle.message("inspection.idempotent.loop.body")); } } diff --git a/java/java-tests/testData/inspection/idempotentLoopBody/IdempotentLoopBody.java b/java/java-tests/testData/inspection/idempotentLoopBody/IdempotentLoopBody.java index cf5553a100bb..bb4bb07922e5 100644 --- a/java/java-tests/testData/inspection/idempotentLoopBody/IdempotentLoopBody.java +++ b/java/java-tests/testData/inspection/idempotentLoopBody/IdempotentLoopBody.java @@ -54,4 +54,14 @@ class IdempotentLoopBody { } return result; } + + volatile int x; + + int testVolatile() { + while(true) { + int localX = x; + if (localX > 0) return localX; + if (localX % 2 == 0) return localX / 2; + } + } } \ No newline at end of file