diff options
-rw-r--r-- | crates/ra_hir_ty/src/tests/traits.rs | 17 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk.rs | 14 |
2 files changed, 29 insertions, 2 deletions
diff --git a/crates/ra_hir_ty/src/tests/traits.rs b/crates/ra_hir_ty/src/tests/traits.rs index 76e2198b6..ae316922b 100644 --- a/crates/ra_hir_ty/src/tests/traits.rs +++ b/crates/ra_hir_ty/src/tests/traits.rs | |||
@@ -959,6 +959,23 @@ fn test() { | |||
959 | } | 959 | } |
960 | 960 | ||
961 | #[test] | 961 | #[test] |
962 | fn error_bound_chalk() { | ||
963 | let t = type_at( | ||
964 | r#" | ||
965 | //- /main.rs | ||
966 | trait Trait { | ||
967 | fn foo(&self) -> u32 {} | ||
968 | } | ||
969 | |||
970 | fn test(x: (impl Trait + UnknownTrait)) { | ||
971 | x.foo()<|>; | ||
972 | } | ||
973 | "#, | ||
974 | ); | ||
975 | assert_eq!(t, "u32"); | ||
976 | } | ||
977 | |||
978 | #[test] | ||
962 | fn assoc_type_bindings() { | 979 | fn assoc_type_bindings() { |
963 | assert_snapshot!( | 980 | assert_snapshot!( |
964 | infer(r#" | 981 | infer(r#" |
diff --git a/crates/ra_hir_ty/src/traits/chalk.rs b/crates/ra_hir_ty/src/traits/chalk.rs index 9e38337e5..555930c9b 100644 --- a/crates/ra_hir_ty/src/traits/chalk.rs +++ b/crates/ra_hir_ty/src/traits/chalk.rs | |||
@@ -129,12 +129,22 @@ impl ToChalk for Ty { | |||
129 | Ty::Bound(idx) => chalk_ir::TyData::BoundVar(idx as usize).intern(), | 129 | Ty::Bound(idx) => chalk_ir::TyData::BoundVar(idx as usize).intern(), |
130 | Ty::Infer(_infer_ty) => panic!("uncanonicalized infer ty"), | 130 | Ty::Infer(_infer_ty) => panic!("uncanonicalized infer ty"), |
131 | Ty::Dyn(predicates) => { | 131 | Ty::Dyn(predicates) => { |
132 | let where_clauses = predicates.iter().cloned().map(|p| p.to_chalk(db)).collect(); | 132 | let where_clauses = predicates |
133 | .iter() | ||
134 | .filter(|p| !p.is_error()) | ||
135 | .cloned() | ||
136 | .map(|p| p.to_chalk(db)) | ||
137 | .collect(); | ||
133 | let bounded_ty = chalk_ir::BoundedTy { bounds: make_binders(where_clauses, 1) }; | 138 | let bounded_ty = chalk_ir::BoundedTy { bounds: make_binders(where_clauses, 1) }; |
134 | chalk_ir::TyData::Dyn(bounded_ty).intern() | 139 | chalk_ir::TyData::Dyn(bounded_ty).intern() |
135 | } | 140 | } |
136 | Ty::Opaque(predicates) => { | 141 | Ty::Opaque(predicates) => { |
137 | let where_clauses = predicates.iter().cloned().map(|p| p.to_chalk(db)).collect(); | 142 | let where_clauses = predicates |
143 | .iter() | ||
144 | .filter(|p| !p.is_error()) | ||
145 | .cloned() | ||
146 | .map(|p| p.to_chalk(db)) | ||
147 | .collect(); | ||
138 | let bounded_ty = chalk_ir::BoundedTy { bounds: make_binders(where_clauses, 1) }; | 148 | let bounded_ty = chalk_ir::BoundedTy { bounds: make_binders(where_clauses, 1) }; |
139 | chalk_ir::TyData::Opaque(bounded_ty).intern() | 149 | chalk_ir::TyData::Opaque(bounded_ty).intern() |
140 | } | 150 | } |