| import org.checkerframework.checker.testchecker.wholeprograminference.qual.Parent; |
| import org.checkerframework.checker.testchecker.wholeprograminference.qual.Sibling1; |
| import org.checkerframework.checker.testchecker.wholeprograminference.qual.Sibling2; |
| |
| 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() { |
| // :: warning: (argument) |
| expectsParent(privateField); |
| // :: warning: (argument) |
| 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) { |
| @SuppressWarnings("cast.unsafe") |
| @Sibling1 String s = (@Sibling1 String) ""; |
| return s; |
| } else { |
| @SuppressWarnings("cast.unsafe") |
| @Sibling2 String s = (@Sibling2 String) ""; |
| return s; |
| } |
| } |
| } |