www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 23104] New: case where use of mixin() is rejected but use of

https://issues.dlang.org/show_bug.cgi?id=23104

          Issue ID: 23104
           Summary: case where use of mixin() is rejected but use of the
                    mixin content as code does
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: b2.temp gmx.com

this does not work:

```
module self;

import self;

enum getMember = `__traits(getMember, sym, m)`;

template printMembers(alias sym)
{

    static foreach (m; __traits(allMembers, sym))
    {
        pragma(msg, __traits(identifier, mixin(getMember)));
        static if (is(mixin(getMember)==module) || // HERE
                   is(mixin(getMember)==class)  || // HERE
                   is(mixin(getMember)==struct))   // HERE
        {
            alias _ = printMembers!(mixin(getMember), m); // ERROR HERE
        }
    }
}

void main()
{
    alias _ = printMembers!(mixin(__MODULE__));
}   
```

but this does

```
module self;

import self;

enum getMember = `__traits(getMember, sym, m)`;

template printMembers(alias sym)
{

    static foreach (m; __traits(allMembers, sym))
    {
        pragma(msg, __traits(identifier, mixin(getMember)));
        static if (is(__traits(getMember, sym, m)==module) || // HERE
                   is(__traits(getMember, sym, m)==class)  || // HERE
                   is(__traits(getMember, sym, m)==struct))   // HERE 
        {
            alias _ = printMembers!(mixin(getMember), m); // NO CHANGE HERE BUT
WORKS
        }
    }
}

void main()
{
    alias _ = printMembers!(mixin(__MODULE__));
}    
```

--
May 12 2022