Erase regions within vtable_trait_first_method_offset
.
This commit is contained in:
parent
473eaa42e9
commit
8841204cc6
@ -748,6 +748,9 @@ fn vtable_trait_first_method_offset<'tcx>(
|
||||
) -> usize {
|
||||
let (trait_to_be_found, trait_owning_vtable) = key;
|
||||
|
||||
// #90177
|
||||
let trait_to_be_found_erased = tcx.erase_regions(trait_to_be_found);
|
||||
|
||||
let vtable_segment_callback = {
|
||||
let mut vtable_base = 0;
|
||||
|
||||
@ -757,7 +760,7 @@ fn vtable_trait_first_method_offset<'tcx>(
|
||||
vtable_base += COMMON_VTABLE_ENTRIES.len();
|
||||
}
|
||||
VtblSegment::TraitOwnEntries { trait_ref, emit_vptr } => {
|
||||
if trait_ref == trait_to_be_found {
|
||||
if tcx.erase_regions(trait_ref) == trait_to_be_found_erased {
|
||||
return ControlFlow::Break(vtable_base);
|
||||
}
|
||||
vtable_base += util::count_own_vtable_entries(tcx, trait_ref);
|
||||
|
32
src/test/ui/hrtb/issue-90177.rs
Normal file
32
src/test/ui/hrtb/issue-90177.rs
Normal file
@ -0,0 +1,32 @@
|
||||
// check-pass
|
||||
|
||||
trait Base<'f> {
|
||||
type Assoc;
|
||||
|
||||
fn do_something(&self);
|
||||
}
|
||||
|
||||
trait ForAnyLifetime: for<'f> Base<'f> {}
|
||||
|
||||
impl<T> ForAnyLifetime for T where T: for<'f> Base<'f> {}
|
||||
|
||||
trait CanBeDynamic: ForAnyLifetime + for<'f> Base<'f, Assoc = ()> {}
|
||||
|
||||
fn foo(a: &dyn CanBeDynamic) {
|
||||
a.do_something();
|
||||
}
|
||||
|
||||
struct S;
|
||||
|
||||
impl<'a> Base<'a> for S {
|
||||
type Assoc = ();
|
||||
|
||||
fn do_something(&self) {}
|
||||
}
|
||||
|
||||
impl CanBeDynamic for S {}
|
||||
|
||||
fn main() {
|
||||
let s = S;
|
||||
foo(&s);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user