On Thursday, 8 November 2018 at 02:22:42 UTC, Jonathan M Davis wrote:
On Wednesday, November 7, 2018 1:03:47 PM MST Michelle Long via Digitalmars- d-learn wrote:
Don't let their psychobabble fool you. They are wrong and you were right from the start.

...

Case A:
{
    if (true) goto X;
    int x;
}
X:


Case B:
{
    if (true) goto X;
    {
       int x;
    }
}
X:


These two cases are EXACTLY the same semantically. It's like
writing A + B and (A + B).

That's not the situation that the OP was describing. If adding braces in a situation where the braces have no semantic effect has any impact on goto, then it's a compiler bug. It's adding a new scope that affects the lifetime of a variable whose declaration is being jumped over by a goto that matters.

I know that you're frustrated, because you've hit a problem with goto in complex code, and you don't have a simple example that shows the compiler bug, but the approach that D takes with goto (and any construct that potentially requires code flow analysis) of avoiding requiring that the compiler be smart is precisely to reduce the risk of there being cases where the compiler is going to screw it up in complex code even though it gets it right in the simple cases. If the language required the compiler to be smart about such things, we'd have a lot more problems with subtle, hard to track down compiler bugs in complex code. So, we'd just have _more_ cases where people would be hitting frustrating bugs like you are.

That's fine. The D compiler writers can decide to do whatever they want. I can simply take my "business" elsewhere if I don't like it.

What I am talking about is about an obvious error(Ok, I haven't produced a simplified test case but dustmite or visual D is not working for me to do so at this point in time, but it would be nice for sake of argument to assume I'm right...).

Regardless, if you want to actually have your problem fixed, you're going to need to provide a reproducible test case in a bugzilla report, even if it's large, otherwise no one is going to be able to track it down for you.

That's easier said than done. I wasn't expecting anyone to be able to fix a bug that can't be reproduced.

What I expect is that, given my assumptions that I'm right, that people can agree the compiler does have a bug or flaw that can easily be fixed give then two simplified test cases basic purely what I have done in my own code.

1.

foreach(...)
{
  if (x) goto Y:
  int z;
}
Y:

Fails.

foreach(...)
{
  if (x) goto Y:
  {
     int z;
  }
}
Y:

Passes.

THAT IS FACT! It doesn't matter if the examples work above. I have simplified what I have done and in my code I simply add brackets and it works! That is what people should be thinking about... not test cases, MWE's, compiler versions, etc.

Is it logical that the compiler **should** error out in the first case and no in the second?

That is what the discussion is ALL about. Once that is dealt with then we can move on to finding out more specifics. There is no reason to build the windows of a house before the foundation, it's just far more work without any benefit.


Once people can say: If that is all you are doing is adding brackets around what follows the goto and break out of scope(which is what the code above says) and you can compile, then it is a compiler bug or flaw.

Once people verify that, rather than trying to create rabbit holes, then I can do more work on finding out more specifics. Until then, it is pointless to do anything on my side because if people come back and say "No, it is suppose to work that way" then what the hell am I trying to simplify and fix? It's not a bug then.


But what it seems is that people cannot reason about the purely theoretical underpinnings of the problem and need proof that there is even a problem in the first place, as if I'm making it up and then they create all kinds of obfuscation that doesn't help anyone.

If you can agree that removing the brackets in the two test cases should work in ALL regular cases then I can attempt to provide more information.

Again, until then, it is pointless. I could waste 10 hours trying to track the issue down to provide a test case and you can just come back and say "Oh, no, that is not a bug, it's suppose to be that way. We will not change anything". I know from previous history that is the typical mentality.

Until We can agree that it is a bug, it is pointless for me to treat it as a bug.



Now, a goto-related regression has recently been reported for joiner:

https://issues.dlang.org/show_bug.cgi?id=19213

where some code worked with joiner in 2.081.2 but does not work with 2.082.0 or later, so you may want to test your code with an older compiler release to see if you've hit a compiler regression. If so, that could be a starting point for tracking down the problem.


Until I can simplify the code I have, it won't matter. If it is the same bug, then it will get fixed when it gets fixed with joiner. If it is a different bug, then it will get fixed with I can produce a test case.

While I could prove that it is a version issue by trying a different compiler version(I guess I should keep an old one around for that purpose) it seems it is likely that it is the same bug...






Reply via email to