Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
March 10, 2019 AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
The compiler complains about `cannot form tuple of tuples` whenever I try to put an AliasSeq in a UDA and try to use it. You would expect the compiler to expand it. Is this a bug? --- import std.meta; enum A; enum B; @AliasSeq!(A,B) // <-- Error: cannot form tuple of tuples struct Foo {} pragma(msg, __traits(getAttributes, Foo)); // <- must be present (error happens only when queried) void main() {} --- link to run.dlang.io: https://run.dlang.io/gist/cd5cd94d8ce5327e8a7d5ad77f1d15b8 |
March 10, 2019 Re: AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sebastiaan Koppe | On Sunday, 10 March 2019 at 13:20:12 UTC, Sebastiaan Koppe wrote:
> The compiler complains about `cannot form tuple of tuples` whenever I try to put an AliasSeq in a UDA and try to use it.
>
> You would expect the compiler to expand it. Is this a bug?
>
> ---
>
> import std.meta;
>
> enum A; enum B;
>
> @AliasSeq!(A,B) // <-- Error: cannot form tuple of tuples
> struct Foo {}
>
> pragma(msg, __traits(getAttributes, Foo)); // <- must be present (error happens only when queried)
>
> void main() {}
>
> ---
>
> link to run.dlang.io: https://run.dlang.io/gist/cd5cd94d8ce5327e8a7d5ad77f1d15b8
It looks like a bug, a "reject-valid" one.
Try the same code with
enum A = 0;
and it work, despite of B being still opaque. The problem may be related to the fact the enum A in the orginal code is opaque and has not type.
I've seen a related issue lately.
|
March 10, 2019 Re: AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On Sunday, 10 March 2019 at 13:41:32 UTC, Basile B. wrote:
> On Sunday, 10 March 2019 at 13:20:12 UTC, Sebastiaan Koppe wrote:
>> The compiler complains about `cannot form tuple of tuples` whenever I try to put an AliasSeq in a UDA and try to use it.
>>
>> You would expect the compiler to expand it. Is this a bug?
>>
>> ---
>>
>> import std.meta;
>>
>> enum A; enum B;
>>
>> @AliasSeq!(A,B) // <-- Error: cannot form tuple of tuples
>> struct Foo {}
>>
>> pragma(msg, __traits(getAttributes, Foo)); // <- must be present (error happens only when queried)
>>
>> void main() {}
>>
>> ---
>>
>> link to run.dlang.io: https://run.dlang.io/gist/cd5cd94d8ce5327e8a7d5ad77f1d15b8
>
> It looks like a bug, a "reject-valid" one.
> Try the same code with
>
> enum A = 0;
>
> and it work, despite of B being still opaque. The problem may be related to the fact the enum A in the orginal code is opaque and has not type.
>
> I've seen a related issue lately.
It was 19605. But the relationship is not so obvious...
|
March 10, 2019 Re: AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On Sunday, 10 March 2019 at 13:41:32 UTC, Basile B. wrote: > It looks like a bug, a "reject-valid" one. > Try the same code with > > enum A = 0; > > and it work, despite of B being still opaque. The problem may be related to the fact the enum A in the orginal code is opaque and has not type. Thanks. The example I posted was a reduced case, but I can still use your trick to fool the compiler. The following is more real: --- import std.meta; enum A; enum B; enum Dummy = 0; // <- Dummy needs to be 0 struct Param(alias T) {} @AliasSeq!(Dummy,Param!A,Param!B) // <- Here Dummy is needed struct Foo {} pragma(msg, __traits(getAttributes, Foo)); void main() {} --- I have created an issue: https://issues.dlang.org/show_bug.cgi?id=19728 |
March 10, 2019 Re: AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sebastiaan Koppe | On Sunday, 10 March 2019 at 16:05:19 UTC, Sebastiaan Koppe wrote:
> On Sunday, 10 March 2019 at 13:41:32 UTC, Basile B. wrote:
>> It looks like a bug, a "reject-valid" one.
>> Try the same code with
>>
>> enum A = 0;
>>
>> and it work, despite of B being still opaque. The problem may be related to the fact the enum A in the orginal code is opaque and has not type.
>
> Thanks. The example I posted was a reduced case, but I can still use your trick to fool the compiler.
>
> The following is more real:
>
> ---
>
> import std.meta;
>
> enum A; enum B; enum Dummy = 0; // <- Dummy needs to be 0
>
> struct Param(alias T) {}
>
> @AliasSeq!(Dummy,Param!A,Param!B) // <- Here Dummy is needed
> struct Foo {}
>
> pragma(msg, __traits(getAttributes, Foo));
>
> void main() {}
>
> ---
>
> I have created an issue: https://issues.dlang.org/show_bug.cgi?id=19728
Yes I see. I've refined a bit the test case and maybe I'll took a look this week.
|
March 10, 2019 Re: AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On Sunday, 10 March 2019 at 16:46:43 UTC, Basile B. wrote:
> Yes I see. I've refined a bit the test case and maybe I'll took a look this week.
Cool. Is it normal to create a testcase that doesn't depend on phobos? I suppose it is needed for it to be included in dmd's testcases.
|
March 10, 2019 Re: AliasSeq in UDA | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sebastiaan Koppe | On Sunday, 10 March 2019 at 17:04:20 UTC, Sebastiaan Koppe wrote:
> On Sunday, 10 March 2019 at 16:46:43 UTC, Basile B. wrote:
>> Yes I see. I've refined a bit the test case and maybe I'll took a look this week.
>
> Cool. Is it normal to create a testcase that doesn't depend on phobos? I suppose it is needed for it to be included in dmd's testcases.
Yes.
|
Copyright © 1999-2021 by the D Language Foundation