import testlib.wholeprograminference.qual.*;
public class LUBAssignmentTest {
// The default type for fields is @DefaultType.
private static int privateField;
public static int publicField;
void assignFieldsToSibling1() {
privateField = getSibling1();
publicField = getSibling1();
}
static {
privateField = getSibling2();
publicField = getSibling2();
}
// LUB between @Sibling1 and @Sibling2 is @Parent, therefore the assignments
// above refine the type of privateField to @Parent.
void testFields() {
//:: error: (argument.type.incompatible)
expectsParent(privateField);
//:: error: (argument.type.incompatible)
expectsParent(publicField);
}
void expectsParent(@Parent int t) {}
static @Sibling1 int getSibling1() {
return 0;
}
static @Sibling2 int getSibling2() {
return 0;
}
String lubTest2() {
if (Math.random() > 0.5) {
//:: warning: (cast.unsafe)
@Sibling1 String s = (@Sibling1 String) "";
return s;
} else {
//:: warning: (cast.unsafe)
@Sibling2 String s = (@Sibling2 String) "";
return s;
}
}
}