AliasAssign - is this a bug?

Mitacha mateusz.mitaszka at gmail.com
Wed Apr 28 10:12:21 UTC 2021


On Wednesday, 28 April 2021 at 09:07:15 UTC, Mathias LANG wrote:
> On Wednesday, 28 April 2021 at 00:29:46 UTC, Andrei 
> Alexandrescu wrote:
>> Is this a bug? If not, where is the mistake in the code?
>
> Not a bug, since `static foreach` does not introduce a scope, 
> you're trying to declare twice the same alias at the same 
> scope, the compiler rightfully flags it.
>
>> If so, what would be a workaround? Thanks!
>
> Depends on what you want to do. Either use a different name, 
> but it will fail as soon as you have more than one 
> instantiation, or re-assign the alias:
>
> ```D
> template AliasThisType(T) {
>     alias A = AliasSeq!();
>     static foreach (U; AliasSeq!(__traits(getMember, T, 
> "xyz"))) {
>         A = AliasSeq!(A, typeof(U)); // No more `alias` here
>     }
>     alias AliasThisType = A;
> }
> ```
Looks like alias reassignment is supported since this 
[PR](https://github.com/dlang/dmd/pull/11846)
Why use `static foreach` to get alias this memeber? You could use 
something like this:
```D
template AliasThisType(T) {
     alias AliasThisMember = __traits(getAliasThis, T);
     alias AliasThisType = typeof(__traits(getMember, T, 
AliasThisMember));
}
```



More information about the Digitalmars-d mailing list