diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-11-06 23:12:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-06 23:12:06 +0100 |
| commit | 43fee0e0a9ffae276d5b0e92e3243a6eccaadcd7 (patch) | |
| tree | 614121464f688d48a598f65332476c0b00c7890b | |
| parent | 5f0e6ca6a3bd38538fd6d14b21b5a6011a8c7baa (diff) | |
| parent | abb9a9853b094eeeea5ea784d188e842a17c5dc8 (diff) | |
| download | rust-43fee0e0a9ffae276d5b0e92e3243a6eccaadcd7.tar.gz rust-43fee0e0a9ffae276d5b0e92e3243a6eccaadcd7.zip | |
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`
| -rw-r--r-- | compiler/rustc_middle/src/ty/relate.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/check/compare_method.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/compare-method/issue-90444.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/compare-method/issue-90444.stderr | 27 |
4 files changed, 51 insertions, 2 deletions
diff --git a/compiler/rustc_middle/src/ty/relate.rs b/compiler/rustc_middle/src/ty/relate.rs index 8b20e1eec9a..c7d8bec506f 100644 --- a/compiler/rustc_middle/src/ty/relate.rs +++ b/compiler/rustc_middle/src/ty/relate.rs @@ -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 { diff --git a/compiler/rustc_typeck/src/check/compare_method.rs b/compiler/rustc_typeck/src/check/compare_method.rs index d5b631df058..7c262dcf723 100644 --- a/compiler/rustc_typeck/src/check/compare_method.rs +++ b/compiler/rustc_typeck/src/check/compare_method.rs @@ -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<'_>, diff --git a/src/test/ui/compare-method/issue-90444.rs b/src/test/ui/compare-method/issue-90444.rs new file mode 100644 index 00000000000..6c287d9a707 --- /dev/null +++ b/src/test/ui/compare-method/issue-90444.rs @@ -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() {} diff --git a/src/test/ui/compare-method/issue-90444.stderr b/src/test/ui/compare-method/issue-90444.stderr new file mode 100644 index 00000000000..84bbec0623f --- /dev/null +++ b/src/test/ui/compare-method/issue-90444.stderr @@ -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`. |
