Auto merge of #122119 - estebank:issue-117846, r=Nadrieril
Silence unecessary !Sized binding error When gathering locals, we introduce a `Sized` obligation for each binding in the pattern. *After* doing so, we typecheck the init expression. If this has a type failure, we store `{type error}`, for both the expression and the pattern. But later we store an inference variable for the pattern. We now avoid any override of an existing type on a hir node when they've already been marked as `{type error}`, and on E0277, when it comes from `VariableType` we silence the error in support of the type error. Fix https://github.com/rust-lang/rust/issues/117846
This commit is contained in:
commit
b7dcabe55e
6 changed files with 94 additions and 1 deletions
|
@ -2953,6 +2953,16 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
}
|
||||
ObligationCauseCode::VariableType(hir_id) => {
|
||||
if let Some(typeck_results) = &self.typeck_results
|
||||
&& let Some(ty) = typeck_results.node_type_opt(hir_id)
|
||||
&& let ty::Error(_) = ty.kind()
|
||||
{
|
||||
err.note(format!(
|
||||
"`{predicate}` isn't satisfied, but the type of this pattern is \
|
||||
`{{type error}}`",
|
||||
));
|
||||
err.downgrade_to_delayed_bug();
|
||||
}
|
||||
match tcx.parent_hir_node(hir_id) {
|
||||
Node::Local(hir::Local { ty: Some(ty), .. }) => {
|
||||
err.span_suggestion_verbose(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue