[Issue 21427] New: switch skips declaration of variable except it actually doesn't
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Nov 26 12:44:15 UTC 2020
https://issues.dlang.org/show_bug.cgi?id=21427
Issue ID: 21427
Summary: switch skips declaration of variable except it
actually doesn't
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: zorael at gmail.com
Manjaro/Arch x86_64, dmd v2.094.1.
dmd complains about a variable declared in a switch case to have skipped its
declaration and compilation fails.
Original reduction: https://run.dlang.io/is/ah4XWa
void main()
{
switch (string.init)
{
case "LS":
switch (string.init)
{
case "sasl":
immutable acceptsExternal = true;
goto case;
version (all)
{
case "twitch.tv/membership":
goto case;
}
case "znc.in/self-message":
break;
default:
break;
}
break;
default:
break;
}
}
> feep[work] | zorael: even shorter https://run.dlang.io/is/nrjBkS
void main()
{
final switch ("1")
{
case "1":
immutable acceptsExternal = true;
break;
{
case "2":
break;
}
}
}
> feep[work] | zorael: this is the actual problem https://run.dlang.io/is/IOW91m
void main()
{
final switch ("1")
{
case "1":
immutable acceptsExternal = true;
break;
{
case "2":
return acceptsExternal;
break;
}
}
}
> feep[work] | zorael: workaround https://run.dlang.io/is/as7yjf
void main()
{
switch (string.init)
{
case "LS":
switch (string.init)
{
case "sasl":
immutable acceptsExternal = true;
goto case;
case "THISNEVERHAPPENS": // workaround for weird D switch scoping issue
version (all)
{
case "twitch.tv/membership":
goto case;
}
case "znc.in/self-message":
break;
default:
break;
}
break;
default:
break;
}
}
> feep[work] | zorael: alternately, explicitly wrap the acceptsExternal block in a {}
[...]
> feep[work] | for one, version shouldn't create a scope
> feep[work] | zorael: the actual problem is it thinks that the versioned case is in a subscope and so the variable "should remain in scope"
> feep[work] | which doesn't work cause you can case jump into the versioned case and skip the immutable variable
> feep[work] | so the real issue is that switch thinks version opens a scope (it doesn't even)
--
More information about the Digitalmars-d-bugs
mailing list