import org.checkerframework.checker.nullness.qual.*; class AnnotatedGenerics2 { // Top-level class to ensure that both classes are processed. //:: error: (initialization.fields.uninitialized) class AnnotatedGenerics2Nble<T extends @Nullable Object> { @NonNull T myFieldNN; @Nullable T myFieldNble; T myFieldT; /* TODO: This test case gets affected by flow inference. * Investigate what the desired behavior is later. void fields() { myFieldNN = myFieldNN; myFieldNble = myFieldNN; myFieldT = myFieldNN; //TODO:: error: (assignment.type.incompatible) myFieldNN = myFieldNble; myFieldNble = myFieldNble; //TODO:: error: (assignment.type.incompatible) myFieldT = myFieldNble; //TODO:: error: (assignment.type.incompatible) myFieldNN = myFieldT; myFieldNble = myFieldT; myFieldT = myFieldT; } */ void fields1() { myFieldNN = myFieldNN; myFieldNble = myFieldNN; myFieldT = myFieldNN; } void fields2() { //:: error: (assignment.type.incompatible) myFieldNN = myFieldNble; myFieldNble = myFieldNble; //:: error: (assignment.type.incompatible) myFieldT = myFieldNble; } void fields3() { //:: error: (assignment.type.incompatible) myFieldNN = myFieldT; myFieldNble = myFieldT; myFieldT = myFieldT; } void params(@NonNull T myParamNN, @Nullable T myParamNble, T myParamT) { myFieldNN = myParamNN; myFieldNble = myParamNN; myFieldT = myParamNN; //:: error: (assignment.type.incompatible) myFieldNN = myParamNble; myFieldNble = myParamNble; //:: error: (assignment.type.incompatible) myFieldT = myParamNble; //:: error: (assignment.type.incompatible) myFieldNN = myParamT; myFieldNble = myParamT; myFieldT = myParamT; } } //:: error: (initialization.fields.uninitialized) class AnnotatedGenerics2NN<T extends @NonNull Object> { @NonNull T myFieldNN; @Nullable T myFieldNble; T myFieldT; /* TODO: This test case gets affected by flow inference. * Investigate what the desired behavior is later. void fields() { myFieldNN = myFieldNN; myFieldNble = myFieldNN; myFieldT = myFieldNN; //TODO:: error: (assignment.type.incompatible) myFieldNN = myFieldNble; myFieldNble = myFieldNble; //TODO:: error: (assignment.type.incompatible) myFieldT = myFieldNble; //TODO:: error: (assignment.type.incompatible) myFieldNN = myFieldT; myFieldNble = myFieldT; myFieldT = myFieldT; } */ void fields1() { myFieldNN = myFieldNN; myFieldNble = myFieldNN; myFieldT = myFieldNN; } void fields2() { //:: error: (assignment.type.incompatible) myFieldNN = myFieldNble; myFieldNble = myFieldNble; //:: error: (assignment.type.incompatible) myFieldT = myFieldNble; } void fields3() { myFieldNN = myFieldT; myFieldNble = myFieldT; myFieldT = myFieldT; } void params(@NonNull T myParamNN, @Nullable T myParamNble, T myParamT) { myFieldNN = myParamNN; myFieldNble = myParamNN; myFieldT = myParamNN; //:: error: (assignment.type.incompatible) myFieldNN = myParamNble; myFieldNble = myParamNble; //:: error: (assignment.type.incompatible) myFieldT = myParamNble; myFieldNN = myParamT; myFieldNble = myParamT; myFieldT = myParamT; } } }