Given an error instantiating the TemplateInstance, give the nested TemplateInstance instantiations that got us here. Those are a list threaded into the nested scopes.
Lazily generate identifier for template instance. This is because 75% of the ident's are never needed.
Compare proposed template instantiation with existing template instantiation. Note that this is not commutative because of the auto ref check.
Returns true if this is not instantiated in non-root module, and is a part of non-speculative instantiatiation.
Find template declaration corresponding to template instance.
Confirm s is a valid template, then store it. Input: sc s candidate symbol of template. It may be: TemplateDeclaration FuncDeclaration with findTemplateDeclRoot() != NULL OverloadSet which contains candidates
Run semantic of tiargs as arguments of template. Input: loc sc tiargs array of template arguments flags 1: replace const variables with their initializers 2: don't devolve Parameter to Type
Run semantic on the elements of tiargs. Input: sc
Determine if template instance is really a template function, and that template function needs to infer types from the function arguments.
Determines if a TemplateInstance will need a nested generation of the TemplateDeclaration. Sets enclosing property if so, and returns != 0;
Append 'this' to the specific module members[]
Declare parameters of template instance, initialize them with the template instance arguments.
This instance needs an identifier for name mangling purposes. Create one by taking the template declaration name and adding the type signature for it.
https://dlang.org/spec/template-mixin.html
Syntax: mixin MixinTemplateName TemplateArguments Identifier;