or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing
xxxxxxxxxx
what the hell
This assumes reader is familiar with the concept of early/late bound lifetimes. There's a section on rustc-dev-guide if not (although i think some details are a bit out of date)
problem & background
Not all lifetimes on a fn can be late bound:
so we make make them early bound
(Closures have the same constraint however it is not enforced leading to soundness bugs, #84385 implements this "downgrading late bound to early bound" for closures)
lifetimes on fn items are only late bound when they are "constrained" by the fn args:
current logic for determining if inputs "constrain" a lifetime works off of HIR so does not normalize aliases. It also assumes that any path with no self type constrains all its substs (i.e.
Foo<'a, u32>
has no self type butT::Assoc
does). This falls apart for top level type aliases (see linked issues):solution
The PR solves this by having the hir visitor that checks for lifetimes in constraining uses check if the path is a
DefKind::Alias
. If it is we ""normalize"" it by callingtype_of
and walking the returned type. This is a bit hacky as it requires a mapping between the substs on the path in hir, and the generics of thetype Alias<...>
which is on the ty layer.Alternative solutions may involve calculating the "late boundness" of lifetimes after/during astconv rather than relying on hir at all. We already have code to determine whether a lifetime SHOULD be late bound or not as this is currently how the error for
fn foo<'a, T: Trait>(_: Alias<'a, T>) -> &'a ();
gets emitted.It is probably not possible to do this right now, late boundness is used by
generics_of
andgather_explicit_predicates_of
as we currently do not put late bound lifetimes inGenerics
. Although this seems sus to me as the long term goal is to make all generics late bound which would result ingenerics_of(function)
being empty? #103448 places all lifetimes inGenerics
regardless of late boundness so that may be a good step towards making this possible.