Skip to content

Commit

Permalink
Rollup merge of #119896 - oli-obk:variance_ice, r=compiler-errors
Browse files Browse the repository at this point in the history
Taint `_` placeholder types in trait impl method signatures

We report an error right below for them, but that kind of broken type can cause subsequent ICEs.

fixes #119867
  • Loading branch information
matthiaskrgr authored Jan 13, 2024
2 parents 2c7ce1c + 4586fdc commit 9696ef7
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 2 deletions.
8 changes: 6 additions & 2 deletions compiler/rustc_hir_analysis/src/astconv/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2659,7 +2659,11 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
self.suggest_trait_fn_ty_for_impl_fn_infer(hir_id, Some(i))
{
infer_replacements.push((a.span, suggested_ty.to_string()));
return suggested_ty;
return Ty::new_error_with_message(
self.tcx(),
a.span,
suggested_ty.to_string(),
);
}
}

Expand All @@ -2677,7 +2681,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
self.suggest_trait_fn_ty_for_impl_fn_infer(hir_id, None)
{
infer_replacements.push((output.span, suggested_ty.to_string()));
suggested_ty
Ty::new_error_with_message(self.tcx(), output.span, suggested_ty.to_string())
} else {
visitor.visit_ty(output);
self.ast_ty_to_ty(output)
Expand Down
13 changes: 13 additions & 0 deletions tests/ui/traits/method-argument-mismatch-variance-ice-119867.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
trait Deserialize {
fn deserialize(&self);
}

struct ArchivedVec<T>(T);

impl<T> Deserialize for ArchivedVec<T> {
fn deserialize(s: _) {}
//~^ ERROR: `_` is not allowed within types on item signatures
//~| ERROR: has a `&self` declaration in the trait, but not in the impl
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions
--> $DIR/method-argument-mismatch-variance-ice-119867.rs:8:23
|
LL | fn deserialize(s: _) {}
| ^ not allowed in type signatures
|
help: try replacing `_` with the type in the corresponding trait method signature
|
LL | fn deserialize(s: &ArchivedVec<T>) {}
| ~~~~~~~~~~~~~~~

error[E0186]: method `deserialize` has a `&self` declaration in the trait, but not in the impl
--> $DIR/method-argument-mismatch-variance-ice-119867.rs:8:5
|
LL | fn deserialize(&self);
| ---------------------- `&self` used in trait
...
LL | fn deserialize(s: _) {}
| ^^^^^^^^^^^^^^^^^^^^ expected `&self` in impl

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0121, E0186.
For more information about an error, try `rustc --explain E0121`.

0 comments on commit 9696ef7

Please sign in to comment.