Fix Chalk panic

Fixes #3865. Basically I forgot to shift 'back' when we got `dyn Trait`s back
from Chalk, so after going through Chalk a few times, the panic happened.
This commit is contained in:
Florian Diebold 2020-04-06 17:24:08 +02:00
parent 109bb1a793
commit 236ac630f6
3 changed files with 33 additions and 2 deletions

View file

@ -860,7 +860,8 @@ pub trait TypeWalk {
);
self
}
// /// Shifts up debruijn indices of `Ty::Bound` vars by `n`.
/// Shifts up debruijn indices of `Ty::Bound` vars by `n`.
fn shift_bound_vars(self, n: DebruijnIndex) -> Self
where
Self: Sized,

View file

@ -2021,3 +2021,28 @@ fn main() {
"###
);
}
#[test]
fn dyn_trait_through_chalk() {
let t = type_at(
r#"
//- /main.rs
struct Box<T> {}
#[lang = "deref"]
trait Deref {
type Target;
}
impl<T> Deref for Box<T> {
type Target = T;
}
trait Trait {
fn foo(&self);
}
fn test(x: Box<dyn Trait>) {
x.foo()<|>;
}
"#,
);
assert_eq!(t, "()");
}

View file

@ -427,7 +427,12 @@ impl ToChalk for GenericPredicate {
db: &dyn HirDatabase,
where_clause: chalk_ir::QuantifiedWhereClause<Interner>,
) -> GenericPredicate {
match where_clause.value {
// we don't produce any where clauses with binders and can't currently deal with them
match where_clause
.value
.shifted_out(&Interner)
.expect("unexpected bound vars in where clause")
{
chalk_ir::WhereClause::Implemented(tr) => {
GenericPredicate::Implemented(from_chalk(db, tr))
}