Rollup merge of #119896 - oli-obk:variance_ice, r=compiler-errors

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
This commit is contained in:
Matthias Krüger 2024-01-13 15:10:29 +01:00 committed by GitHub
commit 9696ef7c12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 2 deletions

View File

@ -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(),
);
}
}
@ -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)

View File

@ -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() {}

View File

@ -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`.