Issue 23104 - case where use of mixin() is rejected but use of the mixin content as code is not
Summary: case where use of mixin() is rejected but use of the mixin content as code is...
Status: RESOLVED INVALID
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P1 normal
Assignee: No Owner
URL:
Keywords: accepts-invalid
Depends on:
Blocks:
 
Reported: 2022-05-12 08:50 UTC by basile-z
Modified: 2022-05-12 09:18 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description basile-z 2022-05-12 08:50:21 UTC
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__));
}    
```
Comment 1 basile-z 2022-05-12 08:57:58 UTC
actually compilation fails/succeeds only depending on

  is(mixin(getMember)==module

VS

  is(__traits(getMember, sym, m)==module
Comment 2 basile-z 2022-05-12 09:18:11 UTC
also the version that compiles should not

   alias _ = printMembers!(mixin(getMember), m);

but printMembers takes only one template type parameter