import org.checkerframework.checker.nullness.qual.*; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; /* * These tests ensure that EnsuresNonNullIf methods * are verified. */ public class AssertIfTrueTestSimple { protected int @Nullable [] values; @EnsuresNonNullIf(result = true, expression = "values") public boolean repNulledBAD() { //:: error: (contracts.conditional.postcondition.not.satisfied) return values == null; } @EnsuresNonNullIf(result = false, expression = "values") public boolean repNulled() { return values == null; } public void addAll(AssertIfTrueTestSimple s) { if (repNulled()) { return; } @NonNull Object x = values; /* TODO skip-tests * The two errors are not raised currently * The assumption that "values" is NN is added above. * However, as repNulled is not pure, it should be removed again here. if (s.repNulled()) { // :: (dereference.of.nullable) values.hashCode(); } else { // we called on "s", so we don't know anything about "values". // :: (assignment.type.incompatible) @NonNull Object y = values; } */ if (s.repNulled()) { //:: error: (dereference.of.nullable) s.values.hashCode(); } else { @NonNull Object y = s.values; } } }