Skip to content

feat: Feature a "type annotations needed" diagnostic#22144

Draft
ChayimFriedman2 wants to merge 8 commits intorust-lang:masterfrom
ChayimFriedman2:type-must-be-known
Draft

feat: Feature a "type annotations needed" diagnostic#22144
ChayimFriedman2 wants to merge 8 commits intorust-lang:masterfrom
ChayimFriedman2:type-must-be-known

Conversation

@ChayimFriedman2
Copy link
Copy Markdown
Contributor

There are two kinds of this diagnostic:

1 Some constructs, like calling or indexing, require the type to be known immediately.
2. Otherwise, if we cannot resolve the variable at the end of inference, it's an error.

This PR implements only the first kind, which is also simpler to implement. We just need to push an error in structurally_resolve_type() (as opposed to try_structurally_resolve_type() that never errors) if the type cannot be resolved, and of course also make sure we only call this function where rustc does.

The second case needs to track the origin of infer vars, and it's for another time.

Blocked on #22141.

@rustbot

This comment has been minimized.

And make `InferenceTable` used by inference only.
Some usages were converted into `demand_eqtype()` which is the name in rustc and also reports diagnostics, and others should use a different method.
The obligation `Type: ParentTrait` for a path used to be registered three(!) times. Leave it registered implicitly as one of the generic predicates of the item.
 - Do not eagerly normalize the `IntoFuture::Output` projection
 - Store `IntoFuture` and `IntoFuture::Output` in `LangItems`, to save computing them every time. They are not really lang items, but are similar in nature.
This is what rustc does. It's more performant, but we couldn't do that so far because old code relied on also restoring the obligations, i.e. it was registering maybe-incorrect obligations in the `InferenceTable` without first checking them in a separate `ObligationCtxt`. That code is now gone.
There are two kinds of this diagnostic:

 1 Some constructs, like calling or indexing, require the type to be known *immediately*.
 2. Otherwise, if we cannot resolve the variable at the end of inference, it's an error.

This PR implements only the first kind, which is also simpler to implement. We just need to push an error in `structurally_resolve_type()` (as opposed to `try_structurally_resolve_type()` that never errors) if the type cannot be resolved, and of course also make sure we only call this function where rustc does.

The second case needs to track the origin of infer vars, and it's for another time.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants