IdempotentLoopBody: disable for volatile reads

GitOrigin-RevId: 27aa820f0311844e7fd4a23daa2e306e2f6bae9d
This commit is contained in:
Tagir Valeev
2020-06-22 20:18:36 +03:00
committed by intellij-monorepo-bot
parent 2c499916f6
commit 70a61859ea
2 changed files with 12 additions and 1 deletions
@@ -63,7 +63,8 @@ public class IdempotentLoopBodyInspection extends AbstractBaseJavaLocalInspectio
Collection<PsiVariable> variables = ControlFlowUtil.getWrittenVariables(bodyFlow, 0, bodyFlow.getSize(), true);
if (variables.isEmpty()) return;
List<PsiReferenceExpression> 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"));
}
}
@@ -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;
}
}
}