Is this a bug? +goto

MatheusBN m at gmail.com
Tue Nov 6 13:53:41 UTC 2018


On Tuesday, 6 November 2018 at 05:46:40 UTC, Jonathan M Davis 
wrote:
> On Monday, November 5, 2018 7:55:46 PM MST MatheusBN via 
> Digitalmars-d-learn wrote:
>> On Tuesday, 6 November 2018 at 01:55:04 UTC, Jonathan M Davis
>>
>> wrote:
>> >> And I found a bit strange that in such code, since "x" is 
>> >> never used, why it isn't skipped.
>> >
>> > It's skipped right over. The goto jumps out of the scope, 
>> > and the line with
>> >
>> > int x;
>> >
>> > is never run. In fact, if you compile with -w or -wi, the 
>> > compiler will give you a warning about unreachable code.
>>
>> That is exactly my point.
>>
>> Since "x" it's skipped and never used, it shouldn't just be a 
>> warning (unreachable code) instead of an error?
>>
>> I'm trying to understand why/when such code could give any 
>> problem.
>>
>> On the other hand if the code were:
>>
>> {
>>     goto Q:
>>     int x;
>>
>>     Q:
>>     x = 10; // <- Now you are accessing an uninitialized 
>> variable.
>> }
>>
>> Then I think an error would be ok.
>
> D tries to _very_ little with code flow analysis, because once 
> you start having to do much with it, odds are that the compiler 
> implementation is going to get it wrong. As such, any feature 
> that involves code flow analysis in D tends to be _very_ 
> simple. So, D avoids the issue here by saying that you cannot 
> skip the initialization of a variable with goto. The compiler 
> is not going to do the complicated logic of keeping track of 
> where you access the variable in relation to the goto. That's 
> exactly the sort of thing that might be obvious in the simple 
> case but is highly likely to be buggy in more complex code. 
> Code such as
>
> {
>     goto Q;
>     int x;
> }
> Q:
>
> or
>
> {
>     if(foo)
>         goto Q;
>     int x;
> }
> Q:
>
>
> is fine, because the compiler can trivially see that it is 
> impossible for x to be used after it's been skipped, whereas 
> with something like
>
> goto Q;
> int x;
> Q:
>
> the compiler has to do much more complicated analysis of what 
> the code is doing in order to determine that, and when the code 
> isn't trivial, that can get _really_ complicated.
>
> You could argue that it would be nicer if the language required 
> that the compiler be smarter about it, but by having the 
> compiler be stupid, it reduces the risk of compiler bugs, and 
> most people would consider code doing much with gotos like this 
> to be poor code anyway. Most of the cases where goto is 
> reasonable tend to be using goto from inside braces already, 
> because it tends to be used as a way to more efficiently exit 
> deeply nested code. And with D's labeled break and continue, 
> the need for using goto outside of switch statements also tends 
> to be lower than it is in C/C++.
>
> - Jonathan M Davis

It's clear now about this decision and by the way thanks for 
replying all my doubts.

MatheusBN.


More information about the Digitalmars-d-learn mailing list