package fieldinvar;
import org.checkerframework.common.value.qual.*;
import org.checkerframework.framework.qual.FieldInvariant;
public class MinLenFieldInvar {
class Super {
public final int @MinLen(2) [] minlen2;
public Super(int @MinLen(2) [] minlen2) {
this.minlen2 = minlen2;
}
}
//:: error: (field.invariant.not.subtype)
@MinLenFieldInvariant(field = "minlen2", minLen = 1)
class InvalidSub extends Super {
public InvalidSub() {
super(new int[] {1, 2});
}
}
@MinLenFieldInvariant(field = "minlen2", minLen = 4)
class ValidSub extends Super {
public final int[] validSubField;
public ValidSub(int[] validSubField) {
super(new int[] {1, 2, 3, 4});
this.validSubField = validSubField;
}
}
//:: error: (field.invariant.not.found.superclass)
@MinLenFieldInvariant(field = "validSubField", minLen = 3)
class InvalidSubSub1 extends ValidSub {
public InvalidSubSub1() {
super(new int[] {1, 2});
}
}
//:: error: (field.invariant.not.subtype.superclass)
@MinLenFieldInvariant(field = "minlen2", minLen = 3)
class InvalidSubSub2 extends ValidSub {
public InvalidSubSub2() {
super(new int[] {1, 2});
}
}
@FieldInvariant(field = "minlen2", qualifier = BottomVal.class)
@MinLenFieldInvariant(field = "validSubField", minLen = 4)
class ValidSubSub extends ValidSub {
public ValidSubSub() {
super(null);
}
void test() {
int @BottomVal [] bot = minlen2;
int @MinLen(4) [] four = validSubField;
}
}
}