Recursive template instantiation

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Mar 13 16:12:47 PDT 2017


On 03/13/2017 11:58 PM, Stefan Koch wrote:
> On Monday, 13 March 2017 at 22:05:24 UTC, Jack Applegame wrote:
>> Is this a bug?
>
> No it's not
>
> struct C
> {
>   B!C;
> }
> is an error.
>
> Howto compute C ?       <------\
> let's check the members;       |
> The member needs a template.   |
> Howto compute the template ?   |
> let's compute the parameters.  |
> What is the first Parameter ?  |
> Its C.                         |
> Howoto compute C        -------/

I don't think that's it.

Here's a variant where B is not instantiated with C:

----
struct A()
{
     ~this() { enum s = C.sizeof; }
}

struct B() { A!() foo; }
struct C { B!() bar; }
----

How to compute C?
Check members.
For member `B!() bar;`, resolve `B!()`.
Check members of `B!()`.
For member `A!() foo;` resolve `A!()`.
Check members of `A!()`.
No members => size = 0 (or rather 1, I guess).
Bubble up.

But the compiler seems to get confused by the destructor. I guess it 
incorrectly(?) sees a need to analyze C again before it can finish up 
`A!()`?


More information about the Digitalmars-d-learn mailing list