On 04/13/2017 11:06 PM, Jesse Phillips wrote:
---------------------
[...]
    private static immutable list = AliasSeq!(
            tuple("a", "q"),
            tuple("b", "r"),
            );
[...]
        switch(search) {
--->        foreach(li; list) { // li initialization is skipped
                mixin("case li[0]:");
                mixin("writeln(li[1]);");
                return;
            }
            default:
            break;
        }
[...]
    }
---------------------

Thoughts?

That's not a static foreach. It's a normal run-time foreach. The switch jumps into the loop body without the loop head ever executing. The compiler is correct when it says that initialization of li is being skipped.

Make `list` an enum or alias instead. Then the foreach is unrolled at compile time, you don't get a deprecation message, and it works correctly.

By the way, in my opinion, `case li[0]:` shouldn't compile with the static immutable `list`. `list` and `li[0]` are dynamic values. The compiler only attempts (and succeeds) to evaluate them at compile time because they're typed as immutable. The way I see it, that only makes things more confusing.

Reply via email to