Thread overview
AliasSeq in UDA
Mar 10, 2019
Sebastiaan Koppe
Mar 10, 2019
Basile B.
Mar 10, 2019
Basile B.
Mar 10, 2019
Sebastiaan Koppe
Mar 10, 2019
Basile B.
Mar 10, 2019
Sebastiaan Koppe
Mar 10, 2019
Basile B.
March 10, 2019
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
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
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
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
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
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
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.