Explicit Binding Scopes
This step makes the end of variable scopes explicit using the Explicit End Of Scope feature.
At the end of each scope, for each variable x declared in that scope in reverse order of
declaration, we add a scope_end!(x) statement.
Before every break;/continue; statement, we similarly scope_end all the in-scope variables that will no
longer be in scope at the target of the break;/continue;.
Finally before a return $local; statement we end the scopes of all locals except $local.
For example:
#![allow(unused)]
fn main() {
let x;
loop {
let b;
b = foo();
let c;
c = bar();
if b {
break;
} else if c {
return b;
}
}
// becomes
let x;
loop {
let b;
b = foo();
let c;
c = bar();
if b {
scope_end!(c);
scope_end!(b);
break;
} else if c {
scope_end!(c);
scope_end!(x);
return b;
}
}
scope_end!(x);
}