import org.checkerframework.checker.nullness.qual.*; import org.checkerframework.checker.nullness.qual.NonNull; class LogicOperations { void andTrueClause(@Nullable Object a) { if (a != null && helper()) { a.toString(); } } void andTrueClauseReverse(@Nullable Object a) { if (helper() && a != null) { a.toString(); } } void oneAndComplement(@Nullable Object a) { if (a != null && helper()) { a.toString(); return; } //:: error: (dereference.of.nullable) a.toString(); // error } void repAndComplement(@Nullable Object a, @Nullable Object b) { if (a == null && b == null) { //:: error: (dereference.of.nullable) a.toString(); // error return; } //:: error: (dereference.of.nullable) a.toString(); // error } void oneOrComplement(@Nullable Object a) { if (a == null || helper()) { //:: error: (dereference.of.nullable) a.toString(); // error return; } a.toString(); } void simpleOr1(@Nullable Object a, @Nullable Object b) { if (a != null || b != null) { //:: error: (dereference.of.nullable) a.toString(); // error } } void simpleOr2(@Nullable Object a, @Nullable Object b) { if (a != null || b != null) { //:: error: (dereference.of.nullable) b.toString(); // error } } void sideeffect() { Object a = "m"; if ((a = null) != "n") { //:: error: (assignment.type.incompatible) @NonNull Object l1 = a; } //:: error: (assignment.type.incompatible) @NonNull Object l2 = a; } static boolean helper() { return true; } }