diff options
author | Florian Diebold <[email protected]> | 2020-04-06 16:24:08 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2020-04-06 16:26:26 +0100 |
commit | 236ac630f6ffc403257d4c77e6187819432956cf (patch) | |
tree | 57e2591705e62e646f1dea42c65bda04042e66fb /crates | |
parent | 109bb1a7935e31d4ee3c036775a89ad0ac0e012b (diff) |
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.
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir_ty/src/lib.rs | 3 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/traits.rs | 25 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk.rs | 7 |
3 files changed, 33 insertions, 2 deletions
diff --git a/crates/ra_hir_ty/src/lib.rs b/crates/ra_hir_ty/src/lib.rs index 9d61bba40..717399b6d 100644 --- a/crates/ra_hir_ty/src/lib.rs +++ b/crates/ra_hir_ty/src/lib.rs | |||
@@ -860,7 +860,8 @@ pub trait TypeWalk { | |||
860 | ); | 860 | ); |
861 | self | 861 | self |
862 | } | 862 | } |
863 | // /// Shifts up debruijn indices of `Ty::Bound` vars by `n`. | 863 | |
864 | /// Shifts up debruijn indices of `Ty::Bound` vars by `n`. | ||
864 | fn shift_bound_vars(self, n: DebruijnIndex) -> Self | 865 | fn shift_bound_vars(self, n: DebruijnIndex) -> Self |
865 | where | 866 | where |
866 | Self: Sized, | 867 | Self: Sized, |
diff --git a/crates/ra_hir_ty/src/tests/traits.rs b/crates/ra_hir_ty/src/tests/traits.rs index 081aa943a..22ae6ca90 100644 --- a/crates/ra_hir_ty/src/tests/traits.rs +++ b/crates/ra_hir_ty/src/tests/traits.rs | |||
@@ -2021,3 +2021,28 @@ fn main() { | |||
2021 | "### | 2021 | "### |
2022 | ); | 2022 | ); |
2023 | } | 2023 | } |
2024 | |||
2025 | #[test] | ||
2026 | fn dyn_trait_through_chalk() { | ||
2027 | let t = type_at( | ||
2028 | r#" | ||
2029 | //- /main.rs | ||
2030 | struct Box<T> {} | ||
2031 | #[lang = "deref"] | ||
2032 | trait Deref { | ||
2033 | type Target; | ||
2034 | } | ||
2035 | impl<T> Deref for Box<T> { | ||
2036 | type Target = T; | ||
2037 | } | ||
2038 | trait Trait { | ||
2039 | fn foo(&self); | ||
2040 | } | ||
2041 | |||
2042 | fn test(x: Box<dyn Trait>) { | ||
2043 | x.foo()<|>; | ||
2044 | } | ||
2045 | "#, | ||
2046 | ); | ||
2047 | assert_eq!(t, "()"); | ||
2048 | } | ||
diff --git a/crates/ra_hir_ty/src/traits/chalk.rs b/crates/ra_hir_ty/src/traits/chalk.rs index 53ce362ea..1bc0f0713 100644 --- a/crates/ra_hir_ty/src/traits/chalk.rs +++ b/crates/ra_hir_ty/src/traits/chalk.rs | |||
@@ -427,7 +427,12 @@ impl ToChalk for GenericPredicate { | |||
427 | db: &dyn HirDatabase, | 427 | db: &dyn HirDatabase, |
428 | where_clause: chalk_ir::QuantifiedWhereClause<Interner>, | 428 | where_clause: chalk_ir::QuantifiedWhereClause<Interner>, |
429 | ) -> GenericPredicate { | 429 | ) -> GenericPredicate { |
430 | match where_clause.value { | 430 | // we don't produce any where clauses with binders and can't currently deal with them |
431 | match where_clause | ||
432 | .value | ||
433 | .shifted_out(&Interner) | ||
434 | .expect("unexpected bound vars in where clause") | ||
435 | { | ||
431 | chalk_ir::WhereClause::Implemented(tr) => { | 436 | chalk_ir::WhereClause::Implemented(tr) => { |
432 | GenericPredicate::Implemented(from_chalk(db, tr)) | 437 | GenericPredicate::Implemented(from_chalk(db, tr)) |
433 | } | 438 | } |