import org.checkerframework.framework.qual.EnsuresQualifier; import org.checkerframework.framework.qual.EnsuresQualifierIf; import org.checkerframework.framework.qual.RequiresQualifier; import testlib.util.EnsuresOdd; import testlib.util.EnsuresOddIf; import testlib.util.Odd; import testlib.util.RequiresOdd; class ContractsOverriding { static class Super { String f, g; void m1() {} void m2() {} @RequiresOdd("g") void m3() {} @RequiresOdd("g") void m3b() {} @RequiresOdd("f") void m4() {} } static class Sub extends Super { String g; @Override @RequiresOdd("f") //:: error: (contracts.precondition.override.invalid) void m1() {} @Override @RequiresQualifier(expression = "f", qualifier = Odd.class) //:: error: (contracts.precondition.override.invalid) void m2() {} @Override // g is a different field than in the supertype @RequiresOdd("g") //:: error: (contracts.precondition.override.invalid) void m3() {} @Override @RequiresOdd("super.g") void m3b() {} @Override // use different string to refer to 'f' and RequiresQualifier instead // of RequiresOdd @RequiresQualifier(expression = "this.f", qualifier = Odd.class) void m4() {} } static class Sub2 extends Super2 { String g; @Override //:: error: (contracts.postcondition.not.satisfied) void m1() {} @Override //:: error: (contracts.postcondition.not.satisfied) void m2() {} @Override @EnsuresOdd("g") //:: error: (contracts.postcondition.override.invalid) void m3() { g = odd; } @Override @EnsuresOdd("f") void m4() { super.m4(); } } static class Super2 { String f, g; @Odd String odd; @EnsuresOdd("f") void m1() { f = odd; } @EnsuresQualifier(expression = "f", qualifier = Odd.class) void m2() { f = odd; } @EnsuresOdd("g") void m3() { g = odd; } @EnsuresQualifier(expression = "this.f", qualifier = Odd.class) void m4() { f = odd; } } static class Sub3 extends Super3 { String g; @Override boolean m1() { //:: error: (contracts.conditional.postcondition.not.satisfied) return true; } @Override boolean m2() { //:: error: (contracts.conditional.postcondition.not.satisfied) return true; } @Override @EnsuresOddIf(expression = "g", result = true) //:: error: (contracts.conditional.postcondition.true.override.invalid) boolean m3() { g = odd; return true; } @Override @EnsuresOddIf(expression = "f", result = true) boolean m4() { return super.m4(); } @Override // invalid result @EnsuresOddIf(expression = "f", result = false) boolean m5() { f = odd; return true; } @EnsuresOddIf(expression = "f", result = false) boolean m6() { f = odd; return true; } @EnsuresQualifierIf(expression = "this.f", qualifier = Odd.class, result = true) boolean m7() { f = odd; return true; } } static class Super3 { String f, g; @Odd String odd; @EnsuresOddIf(expression = "f", result = true) boolean m1() { f = odd; return true; } @EnsuresQualifierIf(expression = "f", qualifier = Odd.class, result = true) boolean m2() { f = odd; return true; } @EnsuresOddIf(expression = "g", result = true) boolean m3() { g = odd; return true; } @EnsuresQualifierIf(expression = "this.f", qualifier = Odd.class, result = true) boolean m4() { f = odd; return true; } @EnsuresQualifierIf(expression = "this.f", qualifier = Odd.class, result = true) boolean m5() { f = odd; return true; } } }