fn ret() -> i64 {
    1
}

fn neg() -> i64 {
    -1
}

fn add() -> i64 {
    1 + 2
}

fn indirect_add() -> i64 {
    let x = 1;
    let y = 2;
    x + y
}

fn arith() -> i32 {
    3*3 + 4*4
}

fn match_int() -> i16 {
    let n = 2;
    match n {
        0 => 0,
        1 => 10,
        2 => 20,
        3 => 30,
        _ => 100,
    }
}

fn match_int_range() -> i64 {
    let n = 42;
    match n {
        0...9 => 0,
        10...19 => 1,
        20...29 => 2,
        30...39 => 3,
        40...49 => 4,
        _ => 5,
    }
}

fn main() {
    assert_eq!(ret(), 1);
    assert_eq!(neg(), -1);
    assert_eq!(add(), 3);
    assert_eq!(indirect_add(), 3);
    assert_eq!(arith(), 5*5);
    assert_eq!(match_int(), 20);
    assert_eq!(match_int_range(), 4);
    assert_eq!(i64::min_value().overflowing_mul(-1), (i64::min_value(), true));
    assert_eq!(i32::min_value().overflowing_mul(-1), (i32::min_value(), true));
    assert_eq!(i16::min_value().overflowing_mul(-1), (i16::min_value(), true));
    assert_eq!(i8::min_value().overflowing_mul(-1), (i8::min_value(), true));
}