This constructor is only called when we figured out which function template to instantiate.
Append 'this' to the specific module members[]
Declare parameters of template instance, initialize them with the template instance arguments.
Compare proposed template instantiation with existing template instantiation. Note that this is not commutative because of the auto ref check.
Find the TemplateDeclaration that matches this TemplateInstance best.
Find template declaration corresponding to template instance.
This instance needs an identifier for name mangling purposes. Create one by taking the template declaration name and adding the type signature for it.
Lazily generate identifier for template instance. This is because 75% of the ident's are never needed.
Determines if a TemplateInstance will need a nested generation of the TemplateDeclaration. Sets enclosing property if so, and returns != 0;
Returns true if this is not instantiated in non-root module, and is a part of non-speculative instantiatiation.
Determine if template instance is really a template function, and that template function needs to infer types from the function arguments.
Given an error instantiating the TemplateInstance, give the nested TemplateInstance instantiations that got us here. Those are a list threaded into the nested scopes.
Run semantic on the elements of tiargs. Input: sc
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
if the instantiation is done with error gagging
if used second constructor
has semanticTiargs() been done?
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 atd tuple being optimized. If found, it's not expanded here but in AliasAssign semantic.
This function is #1 on the list of functions that eat cpu time. Be very, very careful about slowing it down.
Look for member of the form: const(MemberInfo)[] getMembers(string); Returns NULL if not found
Insert Dsymbol in table.
Look up identifier in symbol table.
Return true if any of the members are static ctors or static dtors, or if any members have members that are.
Expands attribute declarations in members in depth first order. Calls dg(size_t symidx, Dsymbol *sym) for each member. If dg returns !=0, stops and returns that value else returns 0. Use this function to avoid the O(N + N^2/2) complexity of calculating dim and calling N times getNth.
https://dlang.org/spec/template.html#explicit_tmp_instantiation
Given: foo!(args) => name = foo tiargs = args