blob: 6a7d170a96cd043a1a881840635617215a0fe439 [file] [log] [blame]
import org.checkerframework.common.value.qual.*;
public class Refinement {
void eq_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
if (x == 1) {
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({2}) int z = x;
} else {
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({1}) int z = x;
}
if (x == w) {
@IntVal({1}) int y = x;
@IntVal({1}) int z = w;
} else {
// These two assignments are illegal because one of x or w could be 1,
// while the other is not. So no refinement can be applied.
// :: error: (assignment)
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({5, 6}) int z = w;
}
}
void lt_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
if (x < 2) {
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({2}) int z = x;
} else {
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({1}) int z = x;
}
if (x < w) {
// :: error: (assignment)
@IntVal({1}) int y = x;
@IntVal({5, 6}) int z = w;
} else {
// :: error: (assignment)
@IntVal({2}) int y = x;
@IntVal({1}) int z = w;
}
}
void lte_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
if (x <= 1) {
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({2}) int z = x;
} else {
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({1}) int z = x;
}
if (x <= w) {
// :: error: (assignment)
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({5, 6}) int z = w;
} else {
@IntVal({2}) int y = x;
@IntVal({1}) int z = w;
}
}
void neq_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
if (x != 1) {
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({1}) int z = x;
} else {
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({2}) int z = x;
}
if (x != w) {
// These two assignments are illegal because one of x or w could be 1,
// while the other is not. So no refinement can be applied.
// :: error: (assignment)
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({5, 6}) int z = w;
} else {
@IntVal({1}) int y = x;
@IntVal({1}) int z = w;
}
}
void gte_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
if (x >= 2) {
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({1}) int z = x;
} else {
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({2}) int z = x;
}
if (x >= w) {
// :: error: (assignment)
@IntVal({2}) int y = x;
@IntVal({1}) int z = w;
} else {
// :: error: (assignment)
@IntVal({1}) int y = x;
@IntVal({5, 6}) int z = w;
}
}
void gt_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
if (x > 1) {
@IntVal({2}) int y = x;
// :: error: (assignment)
@IntVal({1}) int z = x;
} else {
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({2}) int z = x;
}
if (x > w) {
@IntVal({2}) int y = x;
@IntVal({1}) int z = w;
} else {
// :: error: (assignment)
@IntVal({1}) int y = x;
// :: error: (assignment)
@IntVal({5, 6}) int z = w;
}
}
void boolean_test(@IntVal({1, 2}) int x, @IntVal({1, 5, 6}) int w) {
@BoolVal({true}) boolean b = x >= 0;
@BoolVal({false}) boolean c = w == 3;
@BoolVal({true, false}) boolean d = x < w;
}
void test_intrange_eq(@IntRange(from = 3, to = 10) int x, @IntRange(from = 1, to = 5) int y) {
if (x == y) {
@IntRange(from = 3, to = 5) int a = x;
@IntRange(from = 3, to = 5) int b = y;
} else {
@IntRange(from = 6, to = 10)
// :: error: (assignment)
int a = x;
@IntRange(from = 1, to = 2)
// :: error: (assignment)
int b = y;
}
}
void test_intrange_eq2(@IntRange(from = 0, to = 10) int x, @IntRange(from = 0, to = 0) int y) {
if (x == y) {
@IntRange(from = 0, to = 0) int a = x;
@IntRange(from = 0, to = 0) int b = y;
} else {
@IntRange(from = 1, to = 10) int a = x;
@IntRange(from = 0, to = 0) int b = y;
}
}
void test_intrange_eq3(@IntRange(from = 0, to = 10) int x, @IntVal(0) int y) {
if (x == y) {
@IntVal(0) int a = x;
@IntVal(0) int b = y;
} else {
@IntRange(from = 1, to = 10) int a = x;
@IntVal(0) int b = y;
}
if (y != x) {
@IntRange(from = 1, to = 10) int a = x;
@IntVal(0) int b = y;
}
}
void test_intrange_neq(@IntRange(from = 3, to = 10) int x, @IntRange(from = 1, to = 5) int y) {
if (x != y) {
@IntRange(from = 6, to = 10)
// :: error: (assignment)
int a = x;
@IntRange(from = 1, to = 2)
// :: error: (assignment)
int b = y;
} else {
@IntRange(from = 3, to = 5) int a = x;
@IntRange(from = 3, to = 5) int b = y;
}
}
void test_intrange_neq2(@IntRange(from = 3, to = 10) int x, @IntRange(from = 10, to = 10) int y) {
if (x != y) {
@IntRange(from = 3, to = 9) int a = x;
@IntRange(from = 10, to = 10) int b = y;
} else {
@IntRange(from = 10, to = 10) int a = x;
@IntRange(from = 10, to = 10) int b = y;
}
}
void test_intrange_gt(@IntRange(from = 0, to = 10) int x, @IntRange(from = 5, to = 20) int y) {
if (x > y) {
@IntRange(from = 6, to = 10) int a = x;
@IntRange(from = 5, to = 9) int b = y;
} else {
@IntRange(from = 0, to = 10) int a = x;
@IntRange(from = 5, to = 20) int b = y;
}
}
void test_intrange_gt2(@IntRange(from = 5, to = 10) int x, @IntRange(from = 2, to = 7) int y) {
if (x > y) {
@IntRange(from = 5, to = 10) int a = x;
@IntRange(from = 2, to = 7) int b = y;
@IntRange(from = 5, to = 7)
// :: error: (assignment)
int c = x;
@IntRange(from = 5, to = 7)
// :: error: (assignment)
int d = y;
} else {
@IntRange(from = 5, to = 7) int a = x;
@IntRange(from = 5, to = 7) int b = y;
}
}
void test_intrange_lte(@IntRange(from = 0, to = 10) int x, @IntRange(from = 2, to = 7) int y) {
if (x <= y) {
@IntRange(from = 0, to = 7) int a = x;
@IntRange(from = 2, to = 7) int b = y;
} else {
@IntRange(from = 3, to = 10) int a = x;
@IntRange(from = 2, to = 7) int b = y;
}
}
void test_intrange_lte2(@IntRange(from = 2, to = 7) int x, @IntRange(from = 5, to = 10) int y) {
if (x <= y) {
@IntRange(from = 2, to = 7) int a = x;
@IntRange(from = 2, to = 10) int b = y;
} else {
@IntRange(from = 6, to = 7) int a = x;
@IntRange(from = 5, to = 6) int b = y;
}
}
void test_intrange_lt(@IntRange(from = 5, to = 10) int x, @IntRange(from = 2, to = 7) int y) {
if (x < y) {
@IntRange(from = 5, to = 6) int a = x;
@IntRange(from = 6, to = 7) int b = y;
} else {
@IntRange(from = 5, to = 10) int a = x;
@IntRange(from = 2, to = 7) int b = y;
}
}
void test_intrange_lt2(@IntRange(from = 2, to = 7) int x, @IntRange(from = 5, to = 10) int y) {
if (x < y) {
@IntRange(from = 2, to = 7) int a = x;
@IntRange(from = 2, to = 10) int b = y;
} else {
@IntRange(from = 5, to = 7) int a = x;
@IntRange(from = 5, to = 7) int b = y;
}
}
void test_intrange_gte(@IntRange(from = 0, to = 10) int x, @IntRange(from = 2, to = 7) int y) {
if (x >= y) {
@IntRange(from = 2, to = 10) int a = x;
@IntRange(from = 2, to = 7) int b = y;
} else {
@IntRange(from = 0, to = 6) int a = x;
@IntRange(from = 2, to = 7) int b = y;
}
}
void test_intrange_gte2(@IntRange(from = 3, to = 5) int x, @IntRange(from = 2, to = 6) int y) {
if (x >= y) {
@IntRange(from = 3, to = 5) int a = x;
@IntRange(from = 2, to = 6) int b = y;
} else {
@IntRange(from = 3, to = 5) int a = x;
@IntRange(from = 4, to = 6) int b = y;
}
}
}