module 0x42::TestBorrow {
struct R has copy, drop {
x: u64,
y: u64
}
fun test1() : R {
let r = R {x: 3, y: 4};
let r_ref = &mut r;
let x_ref = &mut r_ref.x;
*x_ref = 0;
r
}
fun test2(x_ref: &mut u64, v: u64) {
*x_ref = v
}
public fun test3(r_ref: &mut R, v: u64) {
let x_ref = &mut r_ref.x;
test2(x_ref, v)
}
fun test4() : R {
let r = R {x: 3, y: 4};
let r_ref = &mut r;
test3(r_ref, 0);
r
}
public fun test5(r_ref: &mut R) : &mut u64 {
&mut r_ref.x
}
fun test6() : R {
let r = R {x: 3, y: 4};
let r_ref = &mut r;
let x_ref = test5(r_ref);
test2(x_ref, 0);
r
}
fun test7(b: bool) {
let r1 = R {x: 3, y: 4};
let r2 = R {x: 4, y: 5};
let r_ref = &mut r1;
if (b) {
r_ref = &mut r2;
};
test3(r_ref, 0)
}
fun test8(b: bool, n: u64, r_ref: &mut R) {
let r1 = R {x: 3, y: 4};
let r2 = R {x: 4, y: 5};
let t_ref = &mut r2;
while (0 < n) {
if (n/2 == 0) {
t_ref = &mut r1
} else {
t_ref = &mut r2;
};
n = n - 1
};
if (b) {
test3(r_ref, 0);
} else {
test3(t_ref, 0);
}
}
fun test9(b : bool, r_ref: &mut R) : &mut u64 {
let r_field = &mut r_ref.x;
if(b) {
r_field = &mut r_ref.y;
};
*r_field = 0;
r_field
}
fun test10(b : bool) : R {
let r = R {x: 3, y: 4};
let r_ref = &mut r;
let r_field = &mut r_ref.x;
if(b) {
r_field = test9(b, r_ref);
};
*r_field = 0;
r
}
}