On Friday, 9 November 2012 at 21:32:01 UTC, Manfred Nowak wrote:
Timon Gehr wrote:

The example definitely exposes a bug in DMD.
The D front end I am developing can already handle it.

May I guess, that your front end is also able to handle this code:

struct Elem( size_t myNumber) {
  Elem!( myNumber +1)* next;
}
void main(){
  Elem!0 list;
  list.next= new Elem!1;
}

-manfred

With the unmodified template as posted, I get a very specific error about "recusive expansion", but I can see why using that form of template - it will expand into multiple types forever Elem!(0), Elem!(1), Elem!(2) ... Elem!(infinity).

Now take note that with the modified code below, it works fine, and exactly as I would expect:

struct Elem(T) {
 Elem* next;
}

My attempt to mess up the compiler did not succeed, the code below still compiles as expected.

struct Elem(T) {
 Elem!(T)* next;
}


If it works above, then it should also work with the code I introduced in the OP because it's the exact same scenario, only much more simplified. The type expansion should stop at the pointers, and the error message indicates that it does (there's no recursive expansion message), but it fails to evaluate all the types correctly (forwarded reference message).

I think this example clears the matter up nicely, and the problem I'm experiencing is definitely a compiler bug. I'd like to see this problem resolved, so I'll file a bug report.

BTW, thanks for all the attention to this matter, I've learned a lot more about D templates, such as the recusivness of templates demonstrated by manfred, and the dialogue in here helped me to find a reasonable work-a-round for my particular application.

--rt

Reply via email to