From 620b0f1935404828a145cc341dc1f95da67cd111 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Thu, 28 Jul 2022 17:29:47 +0400 Subject: [PATCH 1/2] improve type mismatch error for functions This also fixes the argument names in `report_closure_arg_mismatch` (confusing expected/found) --- .../src/traits/error_reporting/suggestions.rs | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs index 89d7c050c408b..2d1b2cefad74a 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs @@ -20,6 +20,7 @@ use rustc_hir::def_id::DefId; use rustc_hir::intravisit::Visitor; use rustc_hir::lang_items::LangItem; use rustc_hir::{AsyncGeneratorKind, GeneratorKind, Node}; +use rustc_infer::infer::TyCtxtInferExt; use rustc_middle::hir::map; use rustc_middle::ty::{ self, suggest_arbitrary_trait_bound, suggest_constraining_type_param, AdtKind, DefIdTree, @@ -253,8 +254,8 @@ pub trait InferCtxtExt<'tcx> { &self, span: Span, found_span: Option, - expected_ref: ty::PolyTraitRef<'tcx>, found: ty::PolyTraitRef<'tcx>, + expected: ty::PolyTraitRef<'tcx>, ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed>; fn suggest_fully_qualified_path( @@ -1529,13 +1530,13 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { &self, span: Span, found_span: Option, - expected_ref: ty::PolyTraitRef<'tcx>, found: ty::PolyTraitRef<'tcx>, + expected: ty::PolyTraitRef<'tcx>, ) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> { - pub(crate) fn build_fn_sig_string<'tcx>( + pub(crate) fn build_fn_sig_ty<'tcx>( tcx: TyCtxt<'tcx>, trait_ref: ty::PolyTraitRef<'tcx>, - ) -> String { + ) -> Ty<'tcx> { let inputs = trait_ref.skip_binder().substs.type_at(1); let sig = match inputs.kind() { ty::Tuple(inputs) @@ -1557,10 +1558,11 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { abi::Abi::Rust, ), }; - trait_ref.rebind(sig).to_string() + + tcx.mk_fn_ptr(trait_ref.rebind(sig)) } - let argument_kind = match expected_ref.skip_binder().self_ty().kind() { + let argument_kind = match expected.skip_binder().self_ty().kind() { ty::Closure(..) => "closure", ty::Generator(..) => "generator", _ => "function", @@ -1569,17 +1571,22 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { self.tcx.sess, span, E0631, - "type mismatch in {} arguments", - argument_kind + "type mismatch in {argument_kind} arguments", ); - let found_str = format!("expected signature of `{}`", build_fn_sig_string(self.tcx, found)); - err.span_label(span, found_str); + err.span_label(span, "expected due to this"); let found_span = found_span.unwrap_or(span); - let expected_str = - format!("found signature of `{}`", build_fn_sig_string(self.tcx, expected_ref)); - err.span_label(found_span, expected_str); + err.span_label(found_span, "found signature defined here"); + + let expected = build_fn_sig_ty(self.tcx, expected); + let found = build_fn_sig_ty(self.tcx, found); + + let (expected_str, found_str) = + self.tcx.infer_ctxt().enter(|infcx| infcx.cmp(expected, found)); + + let signature_kind = format!("{argument_kind} signature"); + err.note_expected_found(&signature_kind, expected_str, &signature_kind, found_str); err } From 7da578b8f818cef1957502298f30ff10729278b5 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Thu, 28 Jul 2022 19:33:10 +0400 Subject: [PATCH 2/2] --bless tests --- .../anonymous-higher-ranked-lifetime.stderr | 66 ++++++++++++------- .../expect-infer-var-appearing-twice.stderr | 6 +- src/test/ui/generator/issue-88653.rs | 6 +- src/test/ui/generator/issue-88653.stderr | 7 +- .../bugs/issue-88382.stderr | 6 +- .../intrinsics/const-eval-select-bad.stderr | 6 +- src/test/ui/mismatched_types/E0631.stderr | 24 ++++--- .../closure-arg-type-mismatch.stderr | 18 +++-- .../ui/mismatched_types/fn-variance-1.stderr | 12 ++-- .../ui/mismatched_types/issue-36053-2.stderr | 6 +- .../unboxed-closures-vtable-mismatch.rs | 13 ++-- .../unboxed-closures-vtable-mismatch.stderr | 12 ++-- 12 files changed, 119 insertions(+), 63 deletions(-) diff --git a/src/test/ui/anonymous-higher-ranked-lifetime.stderr b/src/test/ui/anonymous-higher-ranked-lifetime.stderr index c7fb85c8f8263..1a0a5fdf4eb23 100644 --- a/src/test/ui/anonymous-higher-ranked-lifetime.stderr +++ b/src/test/ui/anonymous-higher-ranked-lifetime.stderr @@ -2,10 +2,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:2:5 | LL | f1(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'r, 's> fn(&'r (), &'s ()) -> _` + | expected due to this | + = note: expected closure signature `for<'r, 's> fn(&'r (), &'s ()) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `f1` --> $DIR/anonymous-higher-ranked-lifetime.rs:16:25 | @@ -16,10 +18,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:3:5 | LL | f2(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'a, 'r> fn(&'a (), &'r ()) -> _` + | expected due to this | + = note: expected closure signature `for<'a, 'r> fn(&'a (), &'r ()) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `f2` --> $DIR/anonymous-higher-ranked-lifetime.rs:17:25 | @@ -30,10 +34,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:4:5 | LL | f3(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'r> fn(&(), &'r ()) -> _` + | expected due to this | + = note: expected closure signature `for<'r> fn(&(), &'r ()) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `f3` --> $DIR/anonymous-higher-ranked-lifetime.rs:18:29 | @@ -44,10 +50,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:5:5 | LL | f4(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'s, 'r> fn(&'s (), &'r ()) -> _` + | expected due to this | + = note: expected closure signature `for<'r, 's> fn(&'s (), &'r ()) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `f4` --> $DIR/anonymous-higher-ranked-lifetime.rs:19:25 | @@ -58,10 +66,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:6:5 | LL | f5(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'r> fn(&'r (), &'r ()) -> _` + | expected due to this | + = note: expected closure signature `for<'r> fn(&'r (), &'r ()) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `f5` --> $DIR/anonymous-higher-ranked-lifetime.rs:20:25 | @@ -72,10 +82,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:7:5 | LL | g1(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'r> fn(&'r (), Box<(dyn for<'s> Fn(&'s ()) + 'static)>) -> _` + | expected due to this | + = note: expected closure signature `for<'r> fn(&'r (), Box<(dyn for<'r> Fn(&'r ()) + 'static)>) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `g1` --> $DIR/anonymous-higher-ranked-lifetime.rs:23:25 | @@ -86,10 +98,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:8:5 | LL | g2(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'r> fn(&'r (), for<'s> fn(&'s ())) -> _` + | expected due to this | + = note: expected closure signature `for<'r> fn(&'r (), for<'r> fn(&'r ())) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `g2` --> $DIR/anonymous-higher-ranked-lifetime.rs:24:25 | @@ -100,10 +114,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:9:5 | LL | g3(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'s> fn(&'s (), Box<(dyn for<'r> Fn(&'r ()) + 'static)>) -> _` + | expected due to this | + = note: expected closure signature `for<'s> fn(&'s (), Box<(dyn for<'r> Fn(&'r ()) + 'static)>) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `g3` --> $DIR/anonymous-higher-ranked-lifetime.rs:25:25 | @@ -114,10 +130,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:10:5 | LL | g4(|_: (), _: ()| {}); - | ^^ -------------- found signature of `fn((), ()) -> _` + | ^^ -------------- found signature defined here | | - | expected signature of `for<'s> fn(&'s (), for<'r> fn(&'r ())) -> _` + | expected due to this | + = note: expected closure signature `for<'s> fn(&'s (), for<'r> fn(&'r ())) -> _` + found closure signature `fn((), ()) -> _` note: required by a bound in `g4` --> $DIR/anonymous-higher-ranked-lifetime.rs:26:25 | @@ -128,10 +146,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:11:5 | LL | h1(|_: (), _: (), _: (), _: ()| {}); - | ^^ ---------------------------- found signature of `fn((), (), (), ()) -> _` + | ^^ ---------------------------- found signature defined here | | - | expected signature of `for<'r, 's> fn(&'r (), Box<(dyn for<'t0> Fn(&'t0 ()) + 'static)>, &'s (), for<'t0, 't1> fn(&'t0 (), &'t1 ())) -> _` + | expected due to this | + = note: expected closure signature `for<'r, 's> fn(&'r (), Box<(dyn for<'r> Fn(&'r ()) + 'static)>, &'s (), for<'r, 's> fn(&'r (), &'s ())) -> _` + found closure signature `fn((), (), (), ()) -> _` note: required by a bound in `h1` --> $DIR/anonymous-higher-ranked-lifetime.rs:29:25 | @@ -142,10 +162,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/anonymous-higher-ranked-lifetime.rs:12:5 | LL | h2(|_: (), _: (), _: (), _: ()| {}); - | ^^ ---------------------------- found signature of `fn((), (), (), ()) -> _` + | ^^ ---------------------------- found signature defined here | | - | expected signature of `for<'r, 't0> fn(&'r (), Box<(dyn for<'s> Fn(&'s ()) + 'static)>, &'t0 (), for<'s, 't1> fn(&'s (), &'t1 ())) -> _` + | expected due to this | + = note: expected closure signature `for<'t0, 'r> fn(&'r (), Box<(dyn for<'r> Fn(&'r ()) + 'static)>, &'t0 (), for<'r, 's> fn(&'r (), &'s ())) -> _` + found closure signature `fn((), (), (), ()) -> _` note: required by a bound in `h2` --> $DIR/anonymous-higher-ranked-lifetime.rs:30:25 | diff --git a/src/test/ui/closure-expected-type/expect-infer-var-appearing-twice.stderr b/src/test/ui/closure-expected-type/expect-infer-var-appearing-twice.stderr index ba4c9b6338118..8dccf929b2bd1 100644 --- a/src/test/ui/closure-expected-type/expect-infer-var-appearing-twice.stderr +++ b/src/test/ui/closure-expected-type/expect-infer-var-appearing-twice.stderr @@ -2,10 +2,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/expect-infer-var-appearing-twice.rs:14:5 | LL | with_closure(|x: u32, y: i32| { - | ^^^^^^^^^^^^ ---------------- found signature of `fn(u32, i32) -> _` + | ^^^^^^^^^^^^ ---------------- found signature defined here | | - | expected signature of `fn(_, _) -> _` + | expected due to this | + = note: expected closure signature `fn(_, _) -> _` + found closure signature `fn(u32, i32) -> _` note: required by a bound in `with_closure` --> $DIR/expect-infer-var-appearing-twice.rs:2:14 | diff --git a/src/test/ui/generator/issue-88653.rs b/src/test/ui/generator/issue-88653.rs index caa452060b198..1d9377bcef4de 100644 --- a/src/test/ui/generator/issue-88653.rs +++ b/src/test/ui/generator/issue-88653.rs @@ -7,10 +7,12 @@ use std::ops::Generator; fn foo(bar: bool) -> impl Generator<(bool,)> { //~^ ERROR: type mismatch in generator arguments [E0631] - //~| NOTE: expected signature of `fn((bool,)) -> _` + //~| NOTE: expected due to this + //~| NOTE: expected generator signature `fn((bool,)) -> _` + //~| NOTE: in this expansion of desugaring of `impl Trait` //~| NOTE: in this expansion of desugaring of `impl Trait` |bar| { - //~^ NOTE: found signature of `fn(bool) -> _` + //~^ NOTE: found signature defined here if bar { yield bar; } diff --git a/src/test/ui/generator/issue-88653.stderr b/src/test/ui/generator/issue-88653.stderr index 5bd8ad129fef9..b742c6e2f1c08 100644 --- a/src/test/ui/generator/issue-88653.stderr +++ b/src/test/ui/generator/issue-88653.stderr @@ -2,10 +2,13 @@ error[E0631]: type mismatch in generator arguments --> $DIR/issue-88653.rs:8:22 | LL | fn foo(bar: bool) -> impl Generator<(bool,)> { - | ^^^^^^^^^^^^^^^^^^^^^^^ expected signature of `fn((bool,)) -> _` + | ^^^^^^^^^^^^^^^^^^^^^^^ expected due to this ... LL | |bar| { - | ----- found signature of `fn(bool) -> _` + | ----- found signature defined here + | + = note: expected generator signature `fn((bool,)) -> _` + found generator signature `fn(bool) -> _` error: aborting due to previous error diff --git a/src/test/ui/generic-associated-types/bugs/issue-88382.stderr b/src/test/ui/generic-associated-types/bugs/issue-88382.stderr index ce196dcbd863d..7210895b79bc3 100644 --- a/src/test/ui/generic-associated-types/bugs/issue-88382.stderr +++ b/src/test/ui/generic-associated-types/bugs/issue-88382.stderr @@ -2,13 +2,15 @@ error[E0631]: type mismatch in function arguments --> $DIR/issue-88382.rs:28:40 | LL | do_something(SomeImplementation(), test); - | ------------ ^^^^ expected signature of `for<'r> fn(&'r mut std::iter::Empty) -> _` + | ------------ ^^^^ expected due to this | | | required by a bound introduced by this call ... LL | fn test<'a, I: Iterable>(_: &mut I::Iterator<'a>) {} - | ------------------------------------------------- found signature of `for<'r, 'a> fn(&'r mut <_ as Iterable>::Iterator<'a>) -> _` + | ------------------------------------------------- found signature defined here | + = note: expected function signature `for<'r> fn(&'r mut std::iter::Empty) -> _` + found function signature `for<'a, 'r> fn(&'r mut <_ as Iterable>::Iterator<'a>) -> _` note: required by a bound in `do_something` --> $DIR/issue-88382.rs:22:48 | diff --git a/src/test/ui/intrinsics/const-eval-select-bad.stderr b/src/test/ui/intrinsics/const-eval-select-bad.stderr index 6103d6c6e3a6f..24be028a97a79 100644 --- a/src/test/ui/intrinsics/const-eval-select-bad.stderr +++ b/src/test/ui/intrinsics/const-eval-select-bad.stderr @@ -67,13 +67,15 @@ error[E0631]: type mismatch in function arguments --> $DIR/const-eval-select-bad.rs:34:32 | LL | const fn foo(n: i32) -> i32 { - | --------------------------- found signature of `fn(i32) -> _` + | --------------------------- found signature defined here ... LL | const_eval_select((true,), foo, baz); - | ----------------- ^^^ expected signature of `fn(bool) -> _` + | ----------------- ^^^ expected due to this | | | required by a bound introduced by this call | + = note: expected function signature `fn(bool) -> _` + found function signature `fn(i32) -> _` note: required by a bound in `const_eval_select` --> $SRC_DIR/core/src/intrinsics.rs:LL:COL | diff --git a/src/test/ui/mismatched_types/E0631.stderr b/src/test/ui/mismatched_types/E0631.stderr index 1f2e169c6813c..4d673d45559a9 100644 --- a/src/test/ui/mismatched_types/E0631.stderr +++ b/src/test/ui/mismatched_types/E0631.stderr @@ -2,10 +2,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/E0631.rs:7:5 | LL | foo(|_: isize| {}); - | ^^^ ---------- found signature of `fn(isize) -> _` + | ^^^ ---------- found signature defined here | | - | expected signature of `fn(usize) -> _` + | expected due to this | + = note: expected closure signature `fn(usize) -> _` + found closure signature `fn(isize) -> _` note: required by a bound in `foo` --> $DIR/E0631.rs:3:11 | @@ -16,10 +18,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/E0631.rs:8:5 | LL | bar(|_: isize| {}); - | ^^^ ---------- found signature of `fn(isize) -> _` + | ^^^ ---------- found signature defined here | | - | expected signature of `fn(usize) -> _` + | expected due to this | + = note: expected closure signature `fn(usize) -> _` + found closure signature `fn(isize) -> _` note: required by a bound in `bar` --> $DIR/E0631.rs:4:11 | @@ -30,13 +34,15 @@ error[E0631]: type mismatch in function arguments --> $DIR/E0631.rs:9:9 | LL | fn f(_: u64) {} - | ------------ found signature of `fn(u64) -> _` + | ------------ found signature defined here ... LL | foo(f); - | --- ^ expected signature of `fn(usize) -> _` + | --- ^ expected due to this | | | required by a bound introduced by this call | + = note: expected function signature `fn(usize) -> _` + found function signature `fn(u64) -> _` note: required by a bound in `foo` --> $DIR/E0631.rs:3:11 | @@ -47,13 +53,15 @@ error[E0631]: type mismatch in function arguments --> $DIR/E0631.rs:10:9 | LL | fn f(_: u64) {} - | ------------ found signature of `fn(u64) -> _` + | ------------ found signature defined here ... LL | bar(f); - | --- ^ expected signature of `fn(usize) -> _` + | --- ^ expected due to this | | | required by a bound introduced by this call | + = note: expected function signature `fn(usize) -> _` + found function signature `fn(u64) -> _` note: required by a bound in `bar` --> $DIR/E0631.rs:4:11 | diff --git a/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr b/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr index d9578f6c8dcf6..71469bfec2d39 100644 --- a/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr +++ b/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr @@ -2,10 +2,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/closure-arg-type-mismatch.rs:3:14 | LL | a.iter().map(|_: (u32, u32)| 45); - | ^^^ --------------- found signature of `fn((u32, u32)) -> _` + | ^^^ --------------- found signature defined here | | - | expected signature of `fn(&(u32, u32)) -> _` + | expected due to this | + = note: expected closure signature `fn(&(u32, u32)) -> _` + found closure signature `fn((u32, u32)) -> _` note: required by a bound in `map` --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | @@ -16,10 +18,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/closure-arg-type-mismatch.rs:4:14 | LL | a.iter().map(|_: &(u16, u16)| 45); - | ^^^ ---------------- found signature of `for<'r> fn(&'r (u16, u16)) -> _` + | ^^^ ---------------- found signature defined here | | - | expected signature of `fn(&(u32, u32)) -> _` + | expected due to this | + = note: expected closure signature `fn(&(u32, u32)) -> _` + found closure signature `for<'r> fn(&'r (u16, u16)) -> _` note: required by a bound in `map` --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | @@ -30,10 +34,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/closure-arg-type-mismatch.rs:5:14 | LL | a.iter().map(|_: (u16, u16)| 45); - | ^^^ --------------- found signature of `fn((u16, u16)) -> _` + | ^^^ --------------- found signature defined here | | - | expected signature of `fn(&(u32, u32)) -> _` + | expected due to this | + = note: expected closure signature `fn(&(u32, u32)) -> _` + found closure signature `fn((u16, u16)) -> _` note: required by a bound in `map` --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | diff --git a/src/test/ui/mismatched_types/fn-variance-1.stderr b/src/test/ui/mismatched_types/fn-variance-1.stderr index ce1dde94b5dd0..eec6d83fe223c 100644 --- a/src/test/ui/mismatched_types/fn-variance-1.stderr +++ b/src/test/ui/mismatched_types/fn-variance-1.stderr @@ -2,13 +2,15 @@ error[E0631]: type mismatch in function arguments --> $DIR/fn-variance-1.rs:11:15 | LL | fn takes_mut(x: &mut isize) { } - | --------------------------- found signature of `for<'r> fn(&'r mut isize) -> _` + | --------------------------- found signature defined here ... LL | apply(&3, takes_mut); - | ----- ^^^^^^^^^ expected signature of `fn(&{integer}) -> _` + | ----- ^^^^^^^^^ expected due to this | | | required by a bound introduced by this call | + = note: expected function signature `fn(&{integer}) -> _` + found function signature `for<'r> fn(&'r mut isize) -> _` note: required by a bound in `apply` --> $DIR/fn-variance-1.rs:5:37 | @@ -19,13 +21,15 @@ error[E0631]: type mismatch in function arguments --> $DIR/fn-variance-1.rs:15:19 | LL | fn takes_imm(x: &isize) { } - | ----------------------- found signature of `for<'r> fn(&'r isize) -> _` + | ----------------------- found signature defined here ... LL | apply(&mut 3, takes_imm); - | ----- ^^^^^^^^^ expected signature of `fn(&mut {integer}) -> _` + | ----- ^^^^^^^^^ expected due to this | | | required by a bound introduced by this call | + = note: expected function signature `fn(&mut {integer}) -> _` + found function signature `for<'r> fn(&'r isize) -> _` note: required by a bound in `apply` --> $DIR/fn-variance-1.rs:5:37 | diff --git a/src/test/ui/mismatched_types/issue-36053-2.stderr b/src/test/ui/mismatched_types/issue-36053-2.stderr index 9d1ea70f8a4a4..b11ea97d160be 100644 --- a/src/test/ui/mismatched_types/issue-36053-2.stderr +++ b/src/test/ui/mismatched_types/issue-36053-2.stderr @@ -2,10 +2,12 @@ error[E0631]: type mismatch in closure arguments --> $DIR/issue-36053-2.rs:7:32 | LL | once::<&str>("str").fuse().filter(|a: &str| true).count(); - | ^^^^^^ --------- found signature of `for<'r> fn(&'r str) -> _` + | ^^^^^^ --------- found signature defined here | | - | expected signature of `for<'r> fn(&'r &str) -> _` + | expected due to this | + = note: expected closure signature `for<'r> fn(&'r &str) -> _` + found closure signature `for<'r> fn(&'r str) -> _` note: required by a bound in `filter` --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL | diff --git a/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.rs b/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.rs index 44ec28f53cc62..8dbe3472ea893 100644 --- a/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.rs +++ b/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.rs @@ -2,20 +2,21 @@ use std::ops::FnMut; -fn to_fn_mut>(f: F) -> F { f } +fn to_fn_mut>(f: F) -> F { f } -fn call_itisize>(y: isize, mut f: F) -> isize { -//~^ NOTE required by this bound in `call_it` -//~| NOTE required by a bound in `call_it` +fn call_it isize>(y: isize, mut f: F) -> isize { + //~^ NOTE required by this bound in `call_it` + //~| NOTE required by a bound in `call_it` f(2, y) } pub fn main() { let f = to_fn_mut(|x: usize, y: isize| -> isize { (x as isize) + y }); - //~^ NOTE found signature of `fn(usize, isize) -> _` + //~^ NOTE found signature defined here let z = call_it(3, f); //~^ ERROR type mismatch - //~| NOTE expected signature of `fn(isize, isize) -> _` + //~| NOTE expected due to this + //~| NOTE expected closure signature `fn(isize, _) -> _` //~| NOTE required by a bound introduced by this call println!("{}", z); } diff --git a/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.stderr b/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.stderr index f9ef5bc4e39b3..54b2200652746 100644 --- a/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.stderr +++ b/src/test/ui/mismatched_types/unboxed-closures-vtable-mismatch.stderr @@ -2,18 +2,20 @@ error[E0631]: type mismatch in closure arguments --> $DIR/unboxed-closures-vtable-mismatch.rs:16:24 | LL | let f = to_fn_mut(|x: usize, y: isize| -> isize { (x as isize) + y }); - | ----------------------------- found signature of `fn(usize, isize) -> _` + | ----------------------------- found signature defined here LL | LL | let z = call_it(3, f); - | ------- ^ expected signature of `fn(isize, isize) -> _` + | ------- ^ expected due to this | | | required by a bound introduced by this call | + = note: expected closure signature `fn(isize, _) -> _` + found closure signature `fn(usize, _) -> _` note: required by a bound in `call_it` - --> $DIR/unboxed-closures-vtable-mismatch.rs:7:14 + --> $DIR/unboxed-closures-vtable-mismatch.rs:7:15 | -LL | fn call_itisize>(y: isize, mut f: F) -> isize { - | ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `call_it` +LL | fn call_it isize>(y: isize, mut f: F) -> isize { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `call_it` error: aborting due to previous error