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:
commit
43fee0e0a9
4 changed files with 51 additions and 2 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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<'_>,
|
||||||
|
|
17
src/test/ui/compare-method/issue-90444.rs
Normal file
17
src/test/ui/compare-method/issue-90444.rs
Normal 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() {}
|
27
src/test/ui/compare-method/issue-90444.stderr
Normal file
27
src/test/ui/compare-method/issue-90444.stderr
Normal 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`.
|
Loading…
Add table
Add a link
Reference in a new issue