// A if/else block is valid return statment if all possible branches return some value
// Also serves to check subtyping
// The return logic leads to nonsensical programs with statements after the return, but that's ok

class Main {
	// All returns must be empty, but we don't care for their existence
	void main() {
		int a, b, c;
		if (a == b) {
			return;
		} else {
			while (a > b) {
				return;
			}
			if (c > b) {
				return;
			}
		}
	}

	// All returns must be null, Main (all subtypes of Main), and there must be an unconditional return
	Main action1() {
		Main a;
		Object b;
		boolean x, y;
		if (x) {
			if (y) {
				if (x || y) {
					if (x == y && x != y) {
						return null;
					} else {
						return a;
					}
				} else {
					if (b == null) {
						return a;
					} else {
						return a;
					}
				}
			} else {
				if (b == a || a == null) {
					return null;
				} else {
					return a;
				}
			}
		} else {
			return null;
		}
	}

	// All returns must be null, Main[] (all subtypes of Main[]), and there must be an unconditional return
	Main[] action2() {
		Main[] a, b;
		if (a == b) {
			return a;
		} else {
			if (b != null) {
				return b;
			} else {
				return null;
			}
		}
	}

	// All returns must be int (no subtypes), and there must be an unconditional return
	int action3() {
		int a, b, c, d;
		if (a > b) {
			return c - d;
			while (a != a) {
				return b;
			}
		} else {
			return c * d / a + b % c - a;
		}
	}
}
