Skip to content

Commit 5ca7cd9

Browse files
Merge #5331
5331: Fix #4966 r=flodiebold a=flodiebold We add a level of binders when converting our function pointer to Chalk's; we need to remove it again on the way back. Fixes #4966. Co-authored-by: Florian Diebold <florian.diebold@freiheit.com>
2 parents 39e049d + 8a72e40 commit 5ca7cd9

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

crates/ra_hir_ty/src/tests/regression.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,3 +779,60 @@ pub trait Service<Request> {
779779
"###
780780
);
781781
}
782+
783+
#[test]
784+
fn issue_4966() {
785+
assert_snapshot!(
786+
infer(r#"
787+
pub trait IntoIterator {
788+
type Item;
789+
}
790+
791+
struct Repeat<A> { element: A }
792+
793+
struct Map<F> { f: F }
794+
795+
struct Vec<T> {}
796+
797+
#[lang = "deref"]
798+
pub trait Deref {
799+
type Target;
800+
}
801+
802+
impl<T> Deref for Vec<T> {
803+
type Target = [T];
804+
}
805+
806+
fn from_iter<A, T: IntoIterator<Item = A>>(iter: T) -> Vec<A> {}
807+
808+
fn main() {
809+
let inner = Map { f: |_: &f64| 0.0 };
810+
811+
let repeat = Repeat { element: inner };
812+
813+
let vec = from_iter(repeat);
814+
815+
vec.foo_bar();
816+
}
817+
"#),
818+
@r###"
819+
270..274 'iter': T
820+
289..291 '{}': ()
821+
303..447 '{ ...r(); }': ()
822+
313..318 'inner': Map<|&f64| -> f64>
823+
321..345 'Map { ... 0.0 }': Map<|&f64| -> f64>
824+
330..343 '|_: &f64| 0.0': |&f64| -> f64
825+
331..332 '_': &f64
826+
340..343 '0.0': f64
827+
356..362 'repeat': Repeat<Map<|&f64| -> f64>>
828+
365..390 'Repeat...nner }': Repeat<Map<|&f64| -> f64>>
829+
383..388 'inner': Map<|&f64| -> f64>
830+
401..404 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
831+
407..416 'from_iter': fn from_iter<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>, Repeat<Map<|&f64| -> f64>>>(Repeat<Map<|&f64| -> f64>>) -> Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
832+
407..424 'from_i...epeat)': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
833+
417..423 'repeat': Repeat<Map<|&f64| -> f64>>
834+
431..434 'vec': Vec<IntoIterator::Item<Repeat<Map<|&f64| -> f64>>>>
835+
431..444 'vec.foo_bar()': {unknown}
836+
"###
837+
);
838+
}

crates/ra_hir_ty/src/traits/chalk/mapping.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,12 @@ impl ToChalk for Ty {
117117
let parameters = from_chalk(db, opaque_ty.substitution);
118118
Ty::Opaque(OpaqueTy { opaque_ty_id: impl_trait_id, parameters })
119119
}
120-
chalk_ir::TyData::Function(chalk_ir::Fn { num_binders: _, substitution }) => {
121-
let parameters: Substs = from_chalk(db, substitution);
120+
chalk_ir::TyData::Function(chalk_ir::Fn { num_binders, substitution }) => {
121+
assert_eq!(num_binders, 0);
122+
let parameters: Substs = from_chalk(
123+
db,
124+
substitution.shifted_out(&Interner).expect("fn ptr should have no binders"),
125+
);
122126
Ty::Apply(ApplicationTy {
123127
ctor: TypeCtor::FnPtr { num_args: (parameters.len() - 1) as u16 },
124128
parameters,

0 commit comments

Comments
 (0)