diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java index 96ac6d0ba52e..02cce92a84ea 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/StandardInstructionVisitor.java @@ -92,7 +92,9 @@ public class StandardInstructionVisitor extends InstructionVisitor { onAssigningToNotNullableVariable(instruction, runner); } } - memState.setVarValue(var, dfaSource); + if (!(psiVariable instanceof PsiField) || !psiVariable.hasModifierProperty(PsiModifier.VOLATILE)) { + memState.setVarValue(var, dfaSource); + } } memState.push(dfaDest); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatile.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatile.java new file mode 100644 index 000000000000..535f31d41c94 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatile.java @@ -0,0 +1,26 @@ +import javax.swing.*; + +class Test { + public void setObj(Object obj) { + this.obj = obj; + } + + public void test() { + obj = new Object(); + javax.swing.SwingUtilities.invokeLater(new Runnable() { + public void run() { + Object o = obj; + if (o != null) { + System.out.println("x"); + } + } + }); + final Object u = new Object(); + if (u != null) { + System.out.println("y"); + } + obj = null; + } + + private volatile Object obj; +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatileNotNull.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatileNotNull.java new file mode 100644 index 000000000000..1e8f1b0fd330 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableAnonymousVolatileNotNull.java @@ -0,0 +1,24 @@ +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +class Test { + public void setObj(Object obj) { + this.obj = obj; + } + + public void test() { + obj = new Object(); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + Object o = obj; + if (o != null) { + System.out.println("x"); + } + } + }); + obj = null; + } + + @NotNull private volatile Object obj; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index fe4ecf0d910c..4c356e81fe65 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -29,5 +29,7 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testTryInAnonymous() throws Throwable { doTest(); } public void testNullableAnonymousMethod() throws Throwable { doTest(); } public void testNullableAnonymousParameter() throws Throwable { doTest(); } + public void testNullableAnonymousVolatile() throws Throwable { doTest(); } + public void testNullableAnonymousVolatileNotNull() throws Throwable { doTest(); } }