// Test case for Issue 306:
// https://github.com/typetools/checker-framework/issues/306
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
//@skip-test
class Issue306 {
@MonotonicNonNull Object x;
static <T> T check(T var) {
return var;
}
void fakeMethod() {
// @MonotonicNonNull is not reflexive.
// However, it is the most specific type argument
// inferred for check. Therefore, an error is
// raised.
// We need a mechanism to not consider a
// qualifier in type inference.
check(x);
// Ugly way around the problem:
Issue306.<@Nullable Object>check(x);
// The following error has to be raised: from
// the signature it is not guaranteed that
// the parameter is returned.
//:: error: (monotonic.type.incompatible)
x = check(x);
}
@MonotonicNonNull Object y;
void realError(@MonotonicNonNull Object p) {
//:: error: (monotonic.type.incompatible)
x = y;
//:: error: (monotonic.type.incompatible)
x = p;
// It would be nice not to raise the following
// error.
//:: error: (monotonic.type.incompatible)
x = x;
}
}