Skip to content

attachParentName() infinitely recurses on templated structs

If a System is a template instantiation, attachParentName will be an infinite recursion.

../bubel-ecs/source/bubel/ecs/traits.d(88,10): Error: template instance `ecs.traits.attachParentName!(TemplateStruct!(ParamStruct), "TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct).TemplateStruct!(ParamStruct)")` recursive expansion exceeded allowed nesting limit
import bubel.ecs;

void main() {
    gEntityManager.initialize();
    scope (exit)
        gEntityManager.destroy();

   gEntityManager.registerSystem!(TemplateStruct!ParamStruct)(0);
}

struct ParamStruct {}

struct TemplateStruct(T) {
    mixin ECS.System;
    struct EntitiesData {}
}

Tested with v0.1.1 and 50fa2ce1.