Skip to content

Commit

Permalink
Rollup merge of #90646 - BoxyUwU:funky_ice, r=estebank
Browse files Browse the repository at this point in the history
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`
  • Loading branch information
matthiaskrgr authored Nov 6, 2021
2 parents 5f0e6ca + abb9a98 commit 43fee0e
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 2 deletions.
8 changes: 6 additions & 2 deletions compiler/rustc_middle/src/ty/relate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,12 @@ impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> {
})
.enumerate()
.map(|(i, r)| match r {
Err(TypeError::Sorts(exp_found)) => Err(TypeError::ArgumentSorts(exp_found, i)),
Err(TypeError::Mutability) => Err(TypeError::ArgumentMutability(i)),
Err(TypeError::Sorts(exp_found) | TypeError::ArgumentSorts(exp_found, _)) => {
Err(TypeError::ArgumentSorts(exp_found, i))
}
Err(TypeError::Mutability | TypeError::ArgumentMutability(_)) => {
Err(TypeError::ArgumentMutability(i))
}
r => r,
});
Ok(ty::FnSig {
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_typeck/src/check/compare_method.rs
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,7 @@ fn check_region_bounds_on_impl_item<'tcx>(
Ok(())
}

#[instrument(level = "debug", skip(infcx))]
fn extract_spans_for_error_reporting<'a, 'tcx>(
infcx: &infer::InferCtxt<'a, 'tcx>,
terr: &TypeError<'_>,
Expand Down
17 changes: 17 additions & 0 deletions src/test/ui/compare-method/issue-90444.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 27 additions & 0 deletions src/test/ui/compare-method/issue-90444.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 43fee0e

Please sign in to comment.