Liberate late-bound regions correctly
This commit is contained in:
parent
95b61d16d4
commit
800f1f3513
3 changed files with 56 additions and 2 deletions
|
@ -3758,13 +3758,13 @@ fn hint_missing_borrow<'tcx>(
|
||||||
err: &mut Diagnostic,
|
err: &mut Diagnostic,
|
||||||
) {
|
) {
|
||||||
let found_args = match found.kind() {
|
let found_args = match found.kind() {
|
||||||
ty::FnPtr(f) => f.inputs().skip_binder().iter(),
|
ty::FnPtr(f) => infcx.replace_bound_vars_with_placeholders(*f).inputs().iter(),
|
||||||
kind => {
|
kind => {
|
||||||
span_bug!(span, "found was converted to a FnPtr above but is now {:?}", kind)
|
span_bug!(span, "found was converted to a FnPtr above but is now {:?}", kind)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let expected_args = match expected.kind() {
|
let expected_args = match expected.kind() {
|
||||||
ty::FnPtr(f) => f.inputs().skip_binder().iter(),
|
ty::FnPtr(f) => infcx.replace_bound_vars_with_placeholders(*f).inputs().iter(),
|
||||||
kind => {
|
kind => {
|
||||||
span_bug!(span, "expected was converted to a FnPtr above but is now {:?}", kind)
|
span_bug!(span, "expected was converted to a FnPtr above but is now {:?}", kind)
|
||||||
}
|
}
|
||||||
|
|
28
tests/ui/suggestions/late-bound-in-borrow-closure-sugg.rs
Normal file
28
tests/ui/suggestions/late-bound-in-borrow-closure-sugg.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
pub struct Trader<'a> {
|
||||||
|
closure: Box<dyn Fn(&mut Trader) + 'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Trader<'a> {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Trader {
|
||||||
|
closure: Box::new(|_| {}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn set_closure(&mut self, function: impl Fn(&mut Trader) + 'a) {
|
||||||
|
//foo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let closure = |trader : Trader| {
|
||||||
|
println!("Woooosh!");
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut trader = Trader::new();
|
||||||
|
trader.set_closure(closure);
|
||||||
|
//~^ ERROR type mismatch in closure arguments
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
error[E0631]: type mismatch in closure arguments
|
||||||
|
--> $DIR/late-bound-in-borrow-closure-sugg.rs:26:24
|
||||||
|
|
|
||||||
|
LL | let closure = |trader : Trader| {
|
||||||
|
| ----------------- found signature defined here
|
||||||
|
...
|
||||||
|
LL | trader.set_closure(closure);
|
||||||
|
| ----------- ^^^^^^^ expected due to this
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= note: expected closure signature `for<'a, 'b> fn(&'a mut Trader<'b>) -> _`
|
||||||
|
found closure signature `for<'a> fn(Trader<'a>) -> _`
|
||||||
|
note: required by a bound in `Trader::<'a>::set_closure`
|
||||||
|
--> $DIR/late-bound-in-borrow-closure-sugg.rs:15:50
|
||||||
|
|
|
||||||
|
LL | pub fn set_closure(&mut self, function: impl Fn(&mut Trader) + 'a) {
|
||||||
|
| ^^^^^^^^^^^^^^^ required by this bound in `Trader::<'a>::set_closure`
|
||||||
|
help: consider borrowing the argument
|
||||||
|
|
|
||||||
|
LL | let closure = |trader : &Trader| {
|
||||||
|
| +
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0631`.
|
Loading…
Add table
Add a link
Reference in a new issue