Goto skips declaration

Michelle Long HappyDance321 at gmail.com
Sat Nov 3 21:36:08 UTC 2018


On Saturday, 3 November 2018 at 20:04:40 UTC, Rubn wrote:
> 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.

No, the problem actually exists. Simply because a simplified 
example does not produce the result does not mean it doesn't 
exist. The compiler does a lot of things so to suggest that I 
simply fabricated the error because the simplified demonstration 
case does not produce the error as pathetic.

I got this error in my code and I simplified all the crap out of 
it to what I did that produced it and how I remedied it. It's not 
my fault you don't believe me.






More information about the Digitalmars-d mailing list