Thread overview
Circular enum member references in UDAs
Feb 15
realhet
Feb 16
realhet
February 15

Hello,

Today I tried to upgrade my sources to the latest LDC, but failed with this unfortunate error.

import std;

struct S{ E e; }

enum E
{
    @S(e2) e1,
    @S(e1) e2
}

void main() {
	E.e1.writeln;
}

It only runs in DMD 2.086.1 to 2.101.2

I can only think that the compiler changed from two pass lazy interpretation down to a single pass. So when it finds the very first attribute "@S(e2)" it immediately wants to lookup the member e2 and fails.

I really liked this feature because it was so compact. I was able to define a state-graph used to parse the structure of almost any DLang source files.
This way the structure of the D language can be defined on 1 page in D language itself.

https://ibb.co/HFWR2Qg

Is there a better practice to do this? All else I can think of that the graph-nodes and the graph-edges are declared separately, that would be more redundant. This self-referencing way was the only way to declare them in-place.

February 15

On Thursday, 15 February 2024 at 18:12:42 UTC, realhet wrote:

>

Hello,

Today I tried to upgrade my sources to the latest LDC, but failed with this unfortunate error.

import std;

struct S{ E e; }

enum E
{
    @S(e2) e1,
    @S(e1) e2
}

Looks like someone reported a similar bug in 2018:

https://issues.dlang.org/show_bug.cgi?id=17656

There was an attempt to fix it, but it looks like the PR author wasn't able to get it working correctly in all cases.

February 16

On Thursday, 15 February 2024 at 20:10:15 UTC, Paul Backus wrote:

>

On Thursday, 15 February 2024 at 18:12:42 UTC, realhet wrote:
There was an attempt to fix it, but it looks like the PR author wasn't able to get it working correctly in all cases.

That means I will solve this by putting the UDAs into a separate array.
With a mixin I can still do it without extra redundancy, while the compiler enforce the logical correctness of the identifiers.

Thank You for the info.