blob: e002324e78dca70053821de078339a045732d163 [file] [log] [blame]
// Test case for issue #574: https://github.com/typetools/checker-framework/issues/574
import org.checkerframework.checker.initialization.qual.UnderInitialization;
@SuppressWarnings({
// A warning is issued that fields are not initialized in the constructor.
// That is expected and it is not what is being verified in this test.
"initialization.field.uninitialized",
// Normally @UnknownInitialization is the only initialization annotation allowed on fields.
// However, for the purposes of this test, fields must be annotated with @UnderInitialization.
"initialization.field.type"
})
public class Issue574 {
@UnderInitialization(Object.class) Object o1;
@UnderInitialization(String.class) Object o2;
@UnderInitialization(Character.class) Object o3;
@UnderInitialization(Number.class) Object o4;
@UnderInitialization(Double.class) Object o5;
@UnderInitialization(Integer.class) Object o6;
@UnderInitialization(CharSequence.class) Object i1; // CharSequence is an interface
void testLubOfClasses(boolean flag) {
@UnderInitialization(Object.class) Object l1 = flag ? o2 : o3;
@UnderInitialization(Number.class) Object l2 = flag ? o5 : o6;
@UnderInitialization(Object.class) Object l3 = flag ? o1 : o2;
@UnderInitialization(Object.class) Object l4 = flag ? o1 : o3;
@UnderInitialization(Number.class) Object l5 = flag ? o4 : o5;
@UnderInitialization(Number.class) Object l6 = flag ? o4 : o6;
// :: error: (assignment)
@UnderInitialization(Character.class) Object l7 = flag ? o1 : o2;
// :: error: (assignment)
@UnderInitialization(Integer.class) Object l8 = flag ? o4 : o5;
}
void testLubOfClassesAndInterfaces(boolean flag) {
@UnderInitialization(Object.class) Object l1 = flag ? i1 : o3;
@UnderInitialization(Object.class) Object l2 = flag ? o1 : i1;
@UnderInitialization(Object.class) Object l3 = flag ? o1 : o3;
// :: error: (assignment)
@UnderInitialization(Character.class) Object l4 = flag ? o1 : i1;
}
}