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.
);
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,
"###
);
}
+
+#[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, "()");
+}
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))
}