dsimcha wrote:
import std.stdio;
uint bar = 0;
void main() {
start:
immutable uint foo = bar;
bar++;
writeln(foo);
goto start;
}
foo changes in this case. Is this a real bug, or is it considered undefined
behavior to use goto in this way?
I disagree: foo doesn't change there :รพ.
Declaring a local variable like that actually creates a new scope behind
the scenes, containing everything up to '}' (taking nesting into
account, of course). This means the label is outside the scope of foo,
and foo gets "destroyed" when the goto jumps out of it. A "new" foo is
created (with a different value) when the program enters its scope.
This is basically the same as:
-----
while (true) {
immutable uint foo = bar;
bar++;
writefln(foo);
}
-----
or even:
-----
while (true) {
void nested_fn(uint foo) {
bar++;
writefln(foo);
}
nested_fn(bar);
}
-----
which show the behavior more clearly.