Goto skips declaration
Rubn
where at is.this
Sat Nov 3 20:04:40 UTC 2018
On Saturday, 3 November 2018 at 03:52:12 UTC, Michelle Long wrote:
> On Tuesday, 30 October 2018 at 23:31:46 UTC, luckoverthere
> wrote:
>> On Tuesday, 30 October 2018 at 21:21:22 UTC, Michelle Long
>> wrote:
>>>
>>> You take examples WAY to literal. Sheesh, do you really think
>>> life is that simple? Do you need every detail spelled out for
>>> things to make sense?
>>>
>>> foreach(x; Y)
>>> {
>>> if (something or another which I won't spell out no
>>> matter how much you cry)
>>> goto Q; // compiler complains here about x
>>> int x;
>>> }
>>> Q:
>>>
>>> There is no reason why the compiler should have a problem
>>> with this.. the fact that using brackets around int x;
>>> satisfies the compiler proves this.
>>
>>
>> struct Magic
>> {
>> ~Magic()
>> {
>> writeln("blah");
>> }
>> ]
>>
>> void test()
>> {
>> if(cond)
>> goto Y;
>>
>> Magic magic;
>>
>> Y:
>> writeln("stuff");
>>
>> // calls ~Magic();
>> }
>>
>> You'd need a bunch of extra information to know what is and
>> wasn't actually declared and initialized.
>>
>> "Putting brackets around it proves it".
>>
>> void test()
>> {
>> if(cond)
>> goto Y;
>>
>> {
>> Magic magic;
>>
>> // calls ~Magic();
>> }
>>
>> Y:
>> writeln("stuff");
>>
>> }
>>
>> There is no more conflict with brackets, yes. But expecting
>> the compiler to do this changes the behavior of the code. Sure
>> if there's no destructor it could work around it, but it would
>> complicated code generation. Adding a bunch of time looking
>> for these circumstances.
>>
>> It's just not worth it, use brackets like you are now or move
>> the declarations of your variables up to the top of the scope
>> before any gotos. Pretty simple workarounds.
>
>
> You are not understanding the problem. The goto must be in the
> same scope as the local variable:
>
> {
>
> goto Y;
> int x;
> }
> Y:
>
> The compiler will complain(I'm doing it in a foreach loop) that
> x is skipped!!!
>
> Do you understand?
>
> The goto will always bypass x being declared so it doesn't
> matter. The compiler may optimize out the simple case above,
> but that is irrelevant to the problem.
>
> The problem is simple: The compiler thinks that the declared
> variables are used after the goto but it is impossible since
> the goto skips out of the block and the local variables cease
> to exist.
>
> The compiler treats the problem as if it is
>
> {
> goto Y:
> int x;
> Y:
> }
>
> and that is a totally different problem. They are not the same
> but the compiler treats them the same.
>
> In the second case the goto does skip over the declaration, in
> the first case it does not. In the second case it is a problem
> but in the first case it cannot be.
>
> Again, adding the brackets proves it.
The problem you describe doesn't exist.
https://run.dlang.io/is/Snpt3l
If that isn't the issue, then actually give a runable source
example with the associated error that it produces.
More information about the Digitalmars-d
mailing list