digitalmars.D - AliasAssign - is this a bug?
- Andrei Alexandrescu (25/25) Apr 27 2021 Here's an example reduced from a more complex use case:
- Mathias LANG (17/19) Apr 28 2021 Not a bug, since `static foreach` does not introduce a scope,
- Mitacha (12/32) Apr 28 2021 Looks like alias reassignment is supported since this
Here's an example reduced from a more complex use case:
import std.meta : AliasSeq, staticMap;
template AliasThisType(T) {
alias A = AliasSeq!();
static foreach (U; AliasSeq!(__traits(getMember, T, "xyz"))) {
alias A = AliasSeq!(A, typeof(U));
}
alias AliasThisType = A;
}
struct HasNoAliasThis {
}
struct HasAliasThis {
HasNoAliasThis xyz;
alias xyz this;
}
alias X = AliasThisType!HasAliasThis;
This should work, shouldn't it? When trying to compile I get:
test.d(7): Error: alias
`test.AliasThisType!(HasAliasThis).__anonymous.A` conflicts with alias
`test.AliasThisType!(HasAliasThis).A` at test.d(4)
HasNoAliasThis
test.d(20): Error: template instance `test.AliasThisType!(HasAliasThis)`
error instantiating
Is this a bug? If not, where is the mistake in the code? If so, what
would be a workaround? Thanks!
Apr 27 2021
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; } ```
Apr 28 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: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)); } ```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; } ```
Apr 28 2021








Mitacha <mateusz.mitaszka gmail.com>