blob: 74b684c1fc7d6102e8333ad6bbe89ae0730dac2f [file] [log] [blame]
import org.checkerframework.checker.nullness.qual.*;
public class LazyInitialization {
@Nullable Object nullable;
@NonNull Object nonnull;
@MonotonicNonNull Object lazy;
@MonotonicNonNull Object lazy2 = null;
final @Nullable Object lazy3;
public LazyInitialization(@Nullable Object arg) {
lazy3 = arg;
nonnull = new Object();
}
void randomMethod() {}
void testAssignment() {
lazy = "m";
// :: error: (assignment)
lazy = null; // null
}
void testLazyBeingNull() {
// :: error: (dereference.of.nullable)
nullable.toString(); // error
nonnull.toString();
// :: error: (dereference.of.nullable)
lazy.toString(); // error
// :: error: (dereference.of.nullable)
lazy3.toString(); // error
}
void testAfterInvocation() {
nullable = "m";
nonnull = "m";
lazy = "m";
if (lazy3 == null) {
return;
}
randomMethod();
// :: error: (dereference.of.nullable)
nullable.toString(); // error
nonnull.toString();
lazy.toString();
lazy3.toString();
}
private double @MonotonicNonNull [] intersect;
public void check_modified(double[] a, int count) {
if (intersect != null) {
double @NonNull [] nnda = intersect;
}
}
class PptRelation1 {
public void init_hierarchy_new(PptTopLevel ppt, Object eq) {
ppt.equality_view = eq;
ppt.equality_view.toString();
}
}
class PptTopLevel {
public @MonotonicNonNull Object equality_view;
}
class PptRelation1b {
// This is the same code as in PptRelation1, but comes after the class
// declaration of PptTopLevel. This works as expected.
public void init_hierarchy_new(PptTopLevel ppt, Object eq) {
ppt.equality_view = eq;
ppt.equality_view.toString();
}
}
class PptRelation2 {
public @MonotonicNonNull Object equality_view2;
public void init_hierarchy_new(PptRelation2 pr1, PptRelation2 pr2, Object eq) {
// :: error: (dereference.of.nullable)
pr1.equality_view2.toString();
pr1.equality_view2 = eq;
pr1.equality_view2.toString();
// :: error: (dereference.of.nullable)
pr2.equality_view2.toString();
// :: error: (dereference.of.nullable)
this.equality_view2.toString();
pr2.equality_view2 = eq;
pr2.equality_view2.toString();
this.equality_view2 = eq;
this.equality_view2.toString();
}
}
}