mirror of
https://github.com/rust-lang/rust
synced 2024-09-15 22:50:55 +00:00
Use erased self type when autoderefing for trait error suggestion
This commit is contained in:
parent
77e24f90f5
commit
d1380a1844
|
@ -776,18 +776,14 @@ fn suggest_dereferences(
|
||||||
real_trait_pred = parent_trait_pred;
|
real_trait_pred = parent_trait_pred;
|
||||||
}
|
}
|
||||||
|
|
||||||
let real_ty = real_trait_pred.self_ty();
|
|
||||||
// We `erase_late_bound_regions` here because `make_subregion` does not handle
|
// We `erase_late_bound_regions` here because `make_subregion` does not handle
|
||||||
// `ReLateBound`, and we don't particularly care about the regions.
|
// `ReLateBound`, and we don't particularly care about the regions.
|
||||||
if !self.can_eq(
|
let real_ty = self.tcx.erase_late_bound_regions(real_trait_pred.self_ty());
|
||||||
obligation.param_env,
|
if !self.can_eq(obligation.param_env, real_ty, arg_ty) {
|
||||||
self.tcx.erase_late_bound_regions(real_ty),
|
|
||||||
arg_ty,
|
|
||||||
) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let ty::Ref(region, base_ty, mutbl) = *real_ty.skip_binder().kind() {
|
if let ty::Ref(region, base_ty, mutbl) = *real_ty.kind() {
|
||||||
let autoderef = (self.autoderef_steps)(base_ty);
|
let autoderef = (self.autoderef_steps)(base_ty);
|
||||||
if let Some(steps) =
|
if let Some(steps) =
|
||||||
autoderef.into_iter().enumerate().find_map(|(steps, (ty, obligations))| {
|
autoderef.into_iter().enumerate().find_map(|(steps, (ty, obligations))| {
|
||||||
|
|
22
tests/ui/traits/dont-autoderef-ty-with-escaping-var.rs
Normal file
22
tests/ui/traits/dont-autoderef-ty-with-escaping-var.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// issue:113951
|
||||||
|
|
||||||
|
trait Foo<'x, T> {}
|
||||||
|
|
||||||
|
trait RefFoo<T> {
|
||||||
|
fn ref_foo(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> RefFoo<T> for T
|
||||||
|
where
|
||||||
|
for<'a> &'a mut Vec<&'a u32>: Foo<'static, T>,
|
||||||
|
{
|
||||||
|
fn ref_foo(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn coerce_lifetime2() {
|
||||||
|
<i32 as RefFoo<i32>>::ref_foo(unknown);
|
||||||
|
//~^ ERROR cannot find value `unknown` in this scope
|
||||||
|
//~| ERROR the trait bound `for<'a> &'a mut Vec<&'a u32>: Foo<'static, i32>` is not satisfied
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
27
tests/ui/traits/dont-autoderef-ty-with-escaping-var.stderr
Normal file
27
tests/ui/traits/dont-autoderef-ty-with-escaping-var.stderr
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
error[E0425]: cannot find value `unknown` in this scope
|
||||||
|
--> $DIR/dont-autoderef-ty-with-escaping-var.rs:17:35
|
||||||
|
|
|
||||||
|
LL | <i32 as RefFoo<i32>>::ref_foo(unknown);
|
||||||
|
| ^^^^^^^ not found in this scope
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `for<'a> &'a mut Vec<&'a u32>: Foo<'static, i32>` is not satisfied
|
||||||
|
--> $DIR/dont-autoderef-ty-with-escaping-var.rs:17:35
|
||||||
|
|
|
||||||
|
LL | <i32 as RefFoo<i32>>::ref_foo(unknown);
|
||||||
|
| ----------------------------- ^^^^^^^ the trait `for<'a> Foo<'static, i32>` is not implemented for `&'a mut Vec<&'a u32>`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
note: required for `i32` to implement `RefFoo<i32>`
|
||||||
|
--> $DIR/dont-autoderef-ty-with-escaping-var.rs:9:9
|
||||||
|
|
|
||||||
|
LL | impl<T> RefFoo<T> for T
|
||||||
|
| ^^^^^^^^^ ^
|
||||||
|
LL | where
|
||||||
|
LL | for<'a> &'a mut Vec<&'a u32>: Foo<'static, T>,
|
||||||
|
| --------------- unsatisfied trait bound introduced here
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0277, E0425.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
Loading…
Reference in a new issue