Pass correct HirId to late_bound_vars in diagnostic code
This commit is contained in:
parent
f5cd2c5888
commit
e29ff8c058
@ -882,7 +882,8 @@ pub(in super::super) fn suggest_missing_return_type(
|
|||||||
let ty = self.lowerer().lower_ty(hir_ty);
|
let ty = self.lowerer().lower_ty(hir_ty);
|
||||||
debug!(?ty, "return type (lowered)");
|
debug!(?ty, "return type (lowered)");
|
||||||
debug!(?expected, "expected type");
|
debug!(?expected, "expected type");
|
||||||
let bound_vars = self.tcx.late_bound_vars(hir_ty.hir_id.owner.into());
|
let bound_vars =
|
||||||
|
self.tcx.late_bound_vars(self.tcx.local_def_id_to_hir_id(fn_id));
|
||||||
let ty = Binder::bind_with_vars(ty, bound_vars);
|
let ty = Binder::bind_with_vars(ty, bound_vars);
|
||||||
let ty = self.normalize(hir_ty.span, ty);
|
let ty = self.normalize(hir_ty.span, ty);
|
||||||
let ty = self.tcx.instantiate_bound_regions_with_erased(ty);
|
let ty = self.tcx.instantiate_bound_regions_with_erased(ty);
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
//@ known-bug: rust-lang/rust#125655
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
static foo: dyn Fn() -> u32 = || -> u32 {
|
|
||||||
...
|
|
||||||
0
|
|
||||||
};
|
|
||||||
}
|
|
15
tests/ui/closures/binder/closure-return-type-mismatch.rs
Normal file
15
tests/ui/closures/binder/closure-return-type-mismatch.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// We used to bind the closure return type `&'a ()` with the late-bound vars of
|
||||||
|
// the owner (here `main` & `env` resp.) instead of the ones of the enclosing
|
||||||
|
// function-like / closure inside diagnostic code which was incorrect.
|
||||||
|
|
||||||
|
#![feature(closure_lifetime_binder)]
|
||||||
|
|
||||||
|
// issue: rust-lang/rust#130391
|
||||||
|
fn main() {
|
||||||
|
let _ = for<'a> |x: &'a u8| -> &'a () { x }; //~ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
|
// issue: rust-lang/rust#130663
|
||||||
|
fn env<'r>() {
|
||||||
|
let _ = for<'a> |x: &'a u8| -> &'a () { x }; //~ ERROR mismatched types
|
||||||
|
}
|
25
tests/ui/closures/binder/closure-return-type-mismatch.stderr
Normal file
25
tests/ui/closures/binder/closure-return-type-mismatch.stderr
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/closure-return-type-mismatch.rs:9:45
|
||||||
|
|
|
||||||
|
LL | let _ = for<'a> |x: &'a u8| -> &'a () { x };
|
||||||
|
| ------ ^ expected `&()`, found `&u8`
|
||||||
|
| |
|
||||||
|
| expected `&'a ()` because of return type
|
||||||
|
|
|
||||||
|
= note: expected reference `&'a ()`
|
||||||
|
found reference `&'a u8`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/closure-return-type-mismatch.rs:14:45
|
||||||
|
|
|
||||||
|
LL | let _ = for<'a> |x: &'a u8| -> &'a () { x };
|
||||||
|
| ------ ^ expected `&()`, found `&u8`
|
||||||
|
| |
|
||||||
|
| expected `&'a ()` because of return type
|
||||||
|
|
|
||||||
|
= note: expected reference `&'a ()`
|
||||||
|
found reference `&'a u8`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
@ -15,3 +15,7 @@ fn main() {
|
|||||||
b
|
b
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// issue: rust-lang/rust#130858 rust-lang/rust#125655
|
||||||
|
static FOO: fn() -> bool = || -> bool { 1 };
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/closure-return-type-mismatch.rs:20:41
|
||||||
|
|
|
||||||
|
LL | static FOO: fn() -> bool = || -> bool { 1 };
|
||||||
|
| ---- ^ expected `bool`, found integer
|
||||||
|
| |
|
||||||
|
| expected `bool` because of return type
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/closure-return-type-mismatch.rs:7:9
|
--> $DIR/closure-return-type-mismatch.rs:7:9
|
||||||
|
|
|
|
||||||
@ -19,6 +27,6 @@ LL | if false {
|
|||||||
LL | return "hello"
|
LL | return "hello"
|
||||||
| ^^^^^^^ expected `bool`, found `&str`
|
| ^^^^^^^ expected `bool`, found `&str`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0308`.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
|
Loading…
Reference in New Issue
Block a user