On Monday, 5 November 2018 at 23:54:59 UTC, MatheusBN wrote:
Hi,
I posted this in another thread but without any response.
This code:
void main(){
goto Q;
int x;
Q:
writeln("a");
}
Gives me this error: "source_file.d(4): Error: goto skips
declaration of variable source.main.x at source_file.d(5)"
Now, if I add a pair of brackets:
void main(){
{
goto Q;
int x;
}
Q:
writeln("a");
}
It works. So Is this a bug?
No, it's not. Consider replacing that int with a type that has a
destructor:
struct S { ~this() { /* ... */ } }
void main(){
goto Q;
S x;
Q:
writeln("a");
} // <---
Now, what should happen at that closing paren is a destructor
call, x.__dtor. However, goto jumps over initialization of 'x',
which would lead to calling a destructor on an uninitialized
value. That's why the compiler disallows such skips.
But here it's fine:
void main(){
{
goto Q;
S x;
} // <---
Q:
writeln("a");
}
because goto jumps over both initialization *and* destruction,
i.e. neither would even be performed.
I'm guessing you misunderstood the author of that other thread.
What he's saying is that code similar to the *second* version
fails. That's what all the commotion is about over there. This
simple example obviously works, yet in his more complicated code
base something goes wrong.