[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