import org.checkerframework.checker.nullness.qual.*; /* Test case that illustrated an unsoundness in the unification of * type variables with non-type variables. The error did not previously * get raised, leading to a missed NPE. */ //:: error: (initialization.fields.uninitialized) public class NullableLUB<T extends @Nullable Object> { T t; @Nullable T nt; T m(boolean b, T p) { T r1 = b ? p : null; nt = r1; //:: error: (assignment.type.incompatible) t = r1; //:: error: (return.type.incompatible) return r1; } public static void main(String[] args) { new NullableLUB<@NonNull Object>().m(false, new Object()).toString(); } T m2(boolean b, T p) { T r1 = b ? null : p; nt = r1; //:: error: (assignment.type.incompatible) t = r1; //:: error: (return.type.incompatible) return r1; } }