On Sunday, 22 July 2018 at 14:05:45 UTC, Jonathan M Davis wrote:
On Sunday, July 22, 2018 12:13:43 Anonymouse via Digitalmars-d wrote:
Can this be made a compiler warning?

struct Foo
{
     int i;
}

void main()
{
     Foo foo;

     with (foo)
     {
         i = 42;
         int i;
         i = 24;
     }
}

I'm hesitant to file a bug because it'll just be immediately closed with a link to https://dlang.org/spec/statement.html#WithStatement. I understand that's how it works, but it's weird and weak to human mistakes.

Given the shadowing protections listed in #5, it could certainly be argued that it would be in the spirit of the restrictions that with already has, and I think that there's a pretty clear argument to be made that allowing it is too error-prone, but maybe someone will have a reason why it doesn't make sense to disallow it. I don't know. Regardless, I would suggest that you open an enhancement request. I would guess that it's straightforward enough that a DIP isn't reauired so long as Walter approves of it, but I don't know. Either way, if it's in bugzilla, then it stands a much better chance of happening than if the only record of it is here.

- Jonathan M Davis

#5 says that a symbol defined in an outer scope and used within the with block must not also be a member of Foo, to prevent a silent change in the meaning of the code if that symbol gets added to Foo -- #5 will result in an error message if that happens. Nothing like that applies here ... clearly the two `i's are different, since you can't use a symbol before it's defined (except at top level). You might want to argue that it should be disallowed (I wouldn't), but I don't think you can use "the spirit of #5" to do so.

Reply via email to