Module dmd.dtemplate
Defines TemplateDeclaration
, TemplateInstance
and a few utilities
This modules holds the two main template types:
TemplateDeclaration
, which is the user-provided declaration of a template,
and TemplateInstance
, which is an instance of a TemplateDeclaration
with specific arguments.
Template Parameter
Additionally, the classes for template parameters are defined in this module.
The base class, TemplateParameter
, is inherited by:
- TemplateTypeParameter
- TemplateThisParameter
- TemplateValueParameter
- TemplateAliasParameter
- TemplateTupleParameter
Templates semantic
The start of the template instantiation process looks like this:
- A TypeInstance
or TypeIdentifier
is encountered.
TypeInstance
have a bang (e.g. Foo!(arg)
) while TypeIdentifier
don't.
- A TemplateInstance
is instantiated
- Semantic is run on the TemplateInstance
(see dmd
)
- The TemplateInstance
search for its TemplateDeclaration
,
runs semantic on the template arguments and deduce the best match
among the possible overloads.
- The TemplateInstance
search for existing instances with the same
arguments, and uses it if found.
- Otherwise, the rest of semantic is run on the TemplateInstance
.
Documentation
https://dlang.org/phobos/dmd_dtemplate.html
Coverage
https://codecov.io/gh/dlang/dmd/src/master/src/dmd/dtemplate.d
Functions
Name | Description |
---|---|
arrayObjectIsError(args)
|
Are any of the Objects an error? |
definitelyValueParameter(e)
|
Return true if e could be valid only as a template value parameter. Return false if it might be an alias or tuple. (Note that even in this case, it could still turn out to be a value). |
functionResolve(m, dstart, loc, sc, tiargs, tthis, fargs, pMessage)
|
Given function arguments, figure out which template function to expand, and return matching result. |
getType(o)
|
Try to get arg as a type. |
isError(o)
|
Is this Object an error? |
isExpression(o)
|
These functions substitute for dynamic_cast. dynamic_cast does not work on earlier versions of gcc. |
matchArg(tp, instLoc, sc, tiargs, i, parameters, dedtypes, psparam)
|
Match to a particular TemplateParameter. |
reliesOnTident(t, tparams, iStart)
|
Check whether the type t representation relies on one or more the template parameters. |
unSpeculative(sc, o)
|
IsExpression can evaluate the specified type speculatively, and even if it instantiates any symbols, they are normally unnecessary for the final executable. However, if those symbols leak to the actual code, compiler should remark them as non-speculative to generate their code and link to the final executable. |
Classes
Name | Description |
---|---|
TemplateAliasParameter
|
|
TemplateDeclaration
|
[mixin] template Identifier (parameters) [Constraint] |
TemplateInstance
|
|
TemplateMixin
|
|
TemplateParameter
|
|
TemplateThisParameter
|
|
TemplateTupleParameter
|
|
TemplateTypeParameter
|
|
TemplateValueParameter
|
Structs
Name | Description |
---|---|
TemplateInstanceBox
|
This struct is needed for TemplateInstance to be the key in an associative array. Fixing https://issues.dlang.org/show_bug.cgi?id=15812 and |