[Issue 20018] New: static foreach with static if and is should permit a declaration

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Jul 1 03:23:01 UTC 2019


          Issue ID: 20018
           Summary: static foreach with static if and is should permit a
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: destructionator at gmail.com

Consider the following:

interface Foo(Data) {
    static foreach(memberName; __traits(allMembers, Data))
    static if(is(typeof(__traits(getMember, Data, memberName)) T))
         // use T here

That will currently fail, complaining that T is already declared in the scope.
And normally, this is true - neither static foreach nor static if introduce a

But static if(is( ... identifier)) is a kinda special case. That does introduce
a new symbol... and it is scoped to the body of the static if. So I think
static foreach should permit this code as well - the T there does not actually
continue to be valid in the next loop iteration (or even below the static if),
so the error could, in principle, be removed without breaking anything.

Why is this useful? Well, mostly it is just a convenience: we can then use `T`
in place of the longer `typeof(__traits(getMember, Data, memberName))` inside
the condition. But that would be really quite nice.

Why not use the {{ code }} trick? Well, two reasons: 1) this is at declaration
scope, and the scope block statement is not valid according to the grammar, and
2) I *want* to declare a new member of the interface, and forcing that to be
inside a new scope defeats that purpose.

I consider the current error to almost bug - rejects otherwise valid code - but
I am still calling this an enhancement since I think it would actually be a
special case in the code... just a special case to recognize the already
existing special case of `static if(is(...))`.


More information about the Digitalmars-d-bugs mailing list