blob: 1e75de4132ba4c85f26c8e92f75b12c9c71fa97a [file] [log] [blame]
// A test that the @InheritedMustCall declaration annotation works correctly.
import org.checkerframework.checker.mustcall.qual.*;
@InheritableMustCall("a")
public class Subtype0 {
public class Subtype1 extends Subtype0 {
void m1() {}
}
public class Subtype2 extends Subtype1 {}
static void test(
@Owning Subtype0 s0,
@Owning Subtype1 s1,
@Owning Subtype2 s2,
@Owning Subtype3 s3,
@Owning Subtype4 s4) {
// :: error: assignment
@MustCall({}) Object obj1 = s0;
@MustCall({"a"}) Object obj2 = s0;
// :: error: assignment
@MustCall({}) Object obj3 = s1;
@MustCall({"a"}) Object obj4 = s1;
// :: error: assignment
@MustCall({}) Object obj5 = s2;
@MustCall({"a"}) Object obj6 = s2;
@MustCall({}) Object obj7 = s3;
@MustCall({"a"}) Object obj8 = s3;
@MustCall({}) Object obj9 = s4;
@MustCall({"a"}) Object obj10 = s4;
}
@MustCall({})
// :: error: inconsistent.mustcall.subtype :: error: super.invocation
public class Subtype3 extends Subtype0 {}
@InheritableMustCall({})
// :: error: super.invocation
public class Subtype4 extends Subtype0 {}
@MustCall({"a"}) public class Subtype5 extends Subtype0 {}
@InheritableMustCall({"a"})
public class Subtype6 extends Subtype0 {}
public class Container {
Subtype0 in;
void test() {
if (in instanceof Subtype1) {
((Subtype1) in).m1();
}
}
}
}