import Std::Io::{PrintLine, PrintInt};
import Std::Test::{Test_AssertEqInt, Test_Pass};

func UncheckedInc(p: *int) {
    *p = *p + 1;
}

@[Checked]
func Inc(p: &mut int) {
    *p = *p + 1;
}

@[Checked]
func Get(p: &int) -> int {
    return *p;
}

@[Checked]
func OkBorrow() -> int {
    var x: int = 10;
    Inc(&x);
    return Get(&x);
}

func Main() -> int {
    var n: int = 1;
    UncheckedInc(&n);
    Test_AssertEqInt(n, 2);
    let r: int = OkBorrow();
    Test_AssertEqInt(r, 11);
    PrintInt(r);
    PrintLine("");
    Test_Pass("ownership_checked");
    return 0;
}
