Skip to content

Commit c739e5f

Browse files
committed
Remove Fields Implicit Null Refinement
1 parent 31bd897 commit c739e5f

File tree

5 files changed

+29
-45
lines changed

5 files changed

+29
-45
lines changed

liquidjava-example/src/main/java/testSuite/ErrorNullCheckFieldAssignment.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

liquidjava-example/src/main/java/testSuite/ErrorNullCheckFieldNonInitialized.java

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Refinement Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
public class ErrorNullableFieldNonNullAssumption {
7+
Integer x;
8+
9+
void test() {
10+
mustBeNonNull(x); // we dont know if x is null or not
11+
}
12+
13+
void mustBeNonNull(@Refinement("_ != null") Integer i) {}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Refinement Error
2+
package testSuite;
3+
4+
import liquidjava.specification.Refinement;
5+
6+
public class ErrorNullableFieldNullAssumption {
7+
Integer x;
8+
9+
void test() {
10+
mustBeNull(x); // we dont know if x is null or not
11+
}
12+
13+
void mustBeNull(@Refinement("_ == null") Integer i) {}
14+
}

liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/RefinementTypeChecker.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -246,14 +246,6 @@ public <T> void visitCtField(CtField<T> f) {
246246
if (v instanceof Variable) {
247247
((Variable) v).setLocation("this");
248248
}
249-
// if the field is not initialized and can be null, add instance to context with null equality refinement
250-
if (f.getAssignment() == null && !Utils.isPrimitiveType(f.getType().getQualifiedName())) {
251-
String instanceName = String.format(Formats.INSTANCE, name, context.getCounter());
252-
Predicate initialRefinement = Predicate.createConjunction(ret.substituteVariable(name, instanceName),
253-
Predicate.createNullEq().substituteVariable(Keys.WILDCARD, instanceName));
254-
context.addInstanceToContext(instanceName, f.getType(), initialRefinement, f);
255-
context.addRefinementInstanceToVariable(name, instanceName);
256-
}
257249
}
258250

259251
@Override
@@ -270,13 +262,9 @@ public <T> void visitCtFieldRead(CtFieldRead<T> fieldRead) {
270262
}
271263

272264
} else if (context.hasVariable(String.format(Formats.THIS, fieldName))) {
273-
// resolve to latest instance of this field for flow-sensitive refinement
274265
String thisName = String.format(Formats.THIS, fieldName);
275-
Optional<VariableInstance> ovi = context.getLastVariableInstance(thisName);
276-
String var = ovi.isPresent() ? ovi.get().getName() : thisName;
277266
fieldRead.putMetadata(Keys.REFINEMENT,
278-
Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), Predicate.createVar(var)));
279-
267+
Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), Predicate.createVar(thisName)));
280268
} else if (fieldRead.getVariable().getSimpleName().equals("length")) {
281269
String targetName = fieldRead.getTarget().toString();
282270
fieldRead.putMetadata(Keys.REFINEMENT, Predicate.createEquals(Predicate.createVar(Keys.WILDCARD),

0 commit comments

Comments
 (0)