[Issue 6518] New: break inside a static foreach inside a switch

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Aug 17 06:05:18 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=6518

           Summary: break inside a static foreach inside a switch
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: regression
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2011-08-17 06:05:15 PDT ---
import std.typetuple: TypeTuple;
enum Foo : uint { A, B, C }
alias TypeTuple!(Foo.A, Foo.B, Foo.C) FooNames;
void main() {
    Foo fo;
    switch (fo) {
        /*static*/ foreach (i, op; __traits(allMembers, Foo))
            case FooNames[i]: break;

        default: assert(0);
    }
}


test.d(8): Error: switch case fallthrough - use 'goto case;' if intended
test.d(8): Error: switch case fallthrough - use 'goto case;' if intended
test.d(8): Error: switch case fallthrough - use 'goto case;' if intended
test.d(10): Error: switch case fallthrough - use 'goto default;' if intended


I think DMD 2.042 doesn't have this problem, this code used to work. I think
this problem comes from recent changes in switch switch semantics and analysis.


The following code gives the same errors, showing it's not a problem of break
breaking the foreach loop (like it probably has to do; so maybe the first
example not correct?):

import std.typetuple: TypeTuple;
enum Foo : uint { A, B, C }
alias TypeTuple!(Foo.A, Foo.B, Foo.C) FooNames;
void main() {
    Foo fo;
    LABEL: switch (fo) {
        /*static*/ foreach (i, op; __traits(allMembers, Foo))
            case FooNames[i]: break LABEL;

        default: assert(0);
    }
}

----------------

That code is a reduction of a problem found in a recent version of the modified
regex module:

void parseFlags(S)(S flags)
{
    foreach(ch; flags)//flags are ASCII anyway
    {
        switch(ch)
        {

            foreach(i, op; __traits(allMembers, RegexOption))
            {
                case RegexOptionNames[i]:
                        if(re_flags & mixin("RegexOption."~op))
                            throw new RegexException(text("redundant flag
specified: ",ch));
                        re_flags |= mixin("RegexOption."~op);
                        break;
            }
            default:
                if(__ctfe)
                   assert(text("unknown regex flag '",ch,"'"));
                else
                    new RegexException(text("unknown regex flag '",ch,"'"));
        }

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list