1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
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;
}
}
}
|