]> git.proxmox.com Git - rustc.git/blame - src/doc/rustc-guide/src/traits/specialization.md
New upstream version 1.42.0+dfsg0+pve1
[rustc.git] / src / doc / rustc-guide / src / traits / specialization.md
CommitLineData
a1dfa0c6
XL
1# Specialization
2
3**TODO**: where does Chalk fit in? Should we mention/discuss it here?
4
5Defined in the `specialize` module.
6
7The basic strategy is to build up a *specialization graph* during
8coherence checking (recall that coherence checking looks for overlapping
9impls). Insertion into the graph locates the right place
10to put an impl in the specialization hierarchy; if there is no right
11place (due to partial overlap but no containment), you get an overlap
12error. Specialization is consulted when selecting an impl (of course),
13and the graph is consulted when propagating defaults down the
14specialization hierarchy.
15
16You might expect that the specialization graph would be used during
17selection – i.e. when actually performing specialization. This is
18not done for two reasons:
19
20- It's merely an optimization: given a set of candidates that apply,
21 we can determine the most specialized one by comparing them directly
22 for specialization, rather than consulting the graph. Given that we
23 also cache the results of selection, the benefit of this
24 optimization is questionable.
25
26- To build the specialization graph in the first place, we need to use
27 selection (because we need to determine whether one impl specializes
28 another). Dealing with this reentrancy would require some additional
29 mode switch for selection. Given that there seems to be no strong
30 reason to use the graph anyway, we stick with a simpler approach in
31 selection, and use the graph only for propagating default
32 implementations.
33
34Trait impl selection can succeed even when multiple impls can apply,
35as long as they are part of the same specialization family. In that
36case, it returns a *single* impl on success – this is the most
37specialized impl *known* to apply. However, if there are any inference
38variables in play, the returned impl may not be the actual impl we
39will use at trans time. Thus, we take special care to avoid projecting
40associated types unless either (1) the associated type does not use
41`default` and thus cannot be overridden or (2) all input types are
42known concretely.
532ac7d7
XL
43
44## Additional Resources
45
46[This talk][talk] by @sunjay may be useful. Keep in mind that the talk only
47gives a broad overview of the problem and the solution (it was presented about
48halfway through @sunjay's work). Also, it was given in June 2018, and some
49things may have changed by the time you watch it.
50
51[talk]: https://www.youtube.com/watch?v=rZqS4bLPL24