1
Fork 0

Rollup merge of #90646 - BoxyUwU:funky_ice, r=estebank

type error go brrrrrrrr

Fixes #90444

when we relate something like:
`fn(fn((), (), u32))` with `fn(fn((), (), ()))`
we relate the inner fn ptrs:
`fn((), (), u32)` with `fn((), (), ())`
yielding a `TypeError::ArgumentSorts(_, 2)` which we then use as the `TypeError` for the `fn(fn(..))` which later causes the ICE as the `2` does not correspond to any input or output types in `fn(_)`

r? `@estebank`
This commit is contained in:
Matthias Krüger 2021-11-06 23:12:06 +01:00 committed by GitHub
commit 43fee0e0a9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 2 deletions

View file

@ -187,8 +187,12 @@ impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> {
}) })
.enumerate() .enumerate()
.map(|(i, r)| match r { .map(|(i, r)| match r {
Err(TypeError::Sorts(exp_found)) => Err(TypeError::ArgumentSorts(exp_found, i)), Err(TypeError::Sorts(exp_found) | TypeError::ArgumentSorts(exp_found, _)) => {
Err(TypeError::Mutability) => Err(TypeError::ArgumentMutability(i)), Err(TypeError::ArgumentSorts(exp_found, i))
}
Err(TypeError::Mutability | TypeError::ArgumentMutability(_)) => {
Err(TypeError::ArgumentMutability(i))
}
r => r, r => r,
}); });
Ok(ty::FnSig { Ok(ty::FnSig {

View file

@ -453,6 +453,7 @@ fn check_region_bounds_on_impl_item<'tcx>(
Ok(()) Ok(())
} }
#[instrument(level = "debug", skip(infcx))]
fn extract_spans_for_error_reporting<'a, 'tcx>( fn extract_spans_for_error_reporting<'a, 'tcx>(
infcx: &infer::InferCtxt<'a, 'tcx>, infcx: &infer::InferCtxt<'a, 'tcx>,
terr: &TypeError<'_>, terr: &TypeError<'_>,

View file

@ -0,0 +1,17 @@
pub struct A;
impl From<fn((), (), &())> for A {
fn from(_: fn((), (), &mut ())) -> Self {
//~^ error: method `from` has an incompatible type for trait
loop {}
}
}
pub struct B;
impl From<fn((), (), u32)> for B {
fn from(_: fn((), (), u64)) -> Self {
//~^ error: method `from` has an incompatible type for trait
loop {}
}
}
fn main() {}

View file

@ -0,0 +1,27 @@
error[E0053]: method `from` has an incompatible type for trait
--> $DIR/issue-90444.rs:3:16
|
LL | fn from(_: fn((), (), &mut ())) -> Self {
| ^^^^^^^^^^^^^^^^^^^
| |
| types differ in mutability
| help: change the parameter type to match the trait: `for<'r> fn((), (), &'r ())`
|
= note: expected fn pointer `fn(for<'r> fn((), (), &'r ())) -> A`
found fn pointer `fn(for<'r> fn((), (), &'r mut ())) -> A`
error[E0053]: method `from` has an incompatible type for trait
--> $DIR/issue-90444.rs:11:16
|
LL | fn from(_: fn((), (), u64)) -> Self {
| ^^^^^^^^^^^^^^^
| |
| expected `u32`, found `u64`
| help: change the parameter type to match the trait: `fn((), (), u32)`
|
= note: expected fn pointer `fn(fn((), (), u32)) -> B`
found fn pointer `fn(fn((), (), u64)) -> B`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0053`.