Skip to content

Commit

Permalink
Auto merge of #15317 - HKalbasi:mir, r=HKalbasi
Browse files Browse the repository at this point in the history
Lookup super traits in `is_dyn_method`
  • Loading branch information
bors committed Jul 20, 2023
2 parents cbf3713 + ed8e1fd commit 017d429
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 7 deletions.
27 changes: 27 additions & 0 deletions crates/hir-ty/src/consteval/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1941,6 +1941,33 @@ fn dyn_trait() {
"#,
900,
);
check_number(
r#"
//- minicore: coerce_unsized, index, slice
trait A {
fn x(&self) -> i32;
}
trait B: A {}
impl A for i32 {
fn x(&self) -> i32 {
5
}
}
impl B for i32 {
}
const fn f(x: &dyn B) -> i32 {
x.x()
}
const GOAL: i32 = f(&2i32);
"#,
5,
);
}

#[test]
Expand Down
22 changes: 15 additions & 7 deletions crates/hir-ty/src/method_resolution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -665,13 +665,21 @@ pub fn is_dyn_method(
};
let self_ty = trait_ref.self_type_parameter(Interner);
if let TyKind::Dyn(d) = self_ty.kind(Interner) {
let is_my_trait_in_bounds =
d.bounds.skip_binders().as_slice(Interner).iter().any(|it| match it.skip_binders() {
// rustc doesn't accept `impl Foo<2> for dyn Foo<5>`, so if the trait id is equal, no matter
// what the generics are, we are sure that the method is come from the vtable.
WhereClause::Implemented(tr) => tr.trait_id == trait_ref.trait_id,
_ => false,
});
let is_my_trait_in_bounds = d
.bounds
.skip_binders()
.as_slice(Interner)
.iter()
.map(|it| it.skip_binders())
.flat_map(|it| match it {
WhereClause::Implemented(tr) => {
all_super_traits(db.upcast(), from_chalk_trait_id(tr.trait_id))
}
_ => smallvec![],
})
// rustc doesn't accept `impl Foo<2> for dyn Foo<5>`, so if the trait id is equal, no matter
// what the generics are, we are sure that the method is come from the vtable.
.any(|x| x == trait_id);
if is_my_trait_in_bounds {
return Some(fn_params);
}
Expand Down

0 comments on commit 017d429

Please sign in to comment.