Skip to content

Commit efcdd63

Browse files
committed
Inputs and output in closure datum are contained in a binder
1 parent c19b63c commit efcdd63

File tree

2 files changed

+35
-34
lines changed

2 files changed

+35
-34
lines changed

chalk-solve/src/clauses/builtin_traits/fn_family.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -87,36 +87,41 @@ pub fn add_fn_family_program_clauses<I: Interner>(
8787
_ => false,
8888
};
8989
if trait_matches {
90-
let substitution = Substitution::from(
91-
interner,
92-
Some(ty.clone().intern(interner).cast(interner))
93-
.into_iter()
94-
.chain(
95-
closure_datum
96-
.argument_types
97-
.iter()
98-
.cloned()
99-
.map(|ty| ty.cast(interner)),
100-
),
101-
);
102-
builder.push_fact(TraitRef {
103-
trait_id,
104-
substitution: substitution.clone(),
105-
});
90+
builder.push_binders(
91+
&closure_datum.inputs_and_output,
92+
|builder, inputs_and_output| {
93+
let substitution = Substitution::from(
94+
interner,
95+
Some(ty.clone().intern(interner).cast(interner))
96+
.into_iter()
97+
.chain(
98+
inputs_and_output
99+
.argument_types
100+
.iter()
101+
.cloned()
102+
.map(|ty| ty.cast(interner)),
103+
),
104+
);
105+
builder.push_fact(TraitRef {
106+
trait_id,
107+
substitution: substitution.clone(),
108+
});
106109

107-
if let WellKnownTrait::FnOnceTrait = well_known {
108-
let trait_datum = db.trait_datum(trait_id);
109-
let output_id = trait_datum.associated_ty_ids[0];
110-
let alias = AliasTy::Projection(ProjectionTy {
111-
associated_ty_id: output_id,
112-
substitution,
113-
});
114-
let return_type = closure_datum.return_type.clone();
115-
builder.push_fact(Normalize {
116-
alias,
117-
ty: return_type,
118-
});
119-
}
110+
if let WellKnownTrait::FnOnceTrait = well_known {
111+
let trait_datum = db.trait_datum(trait_id);
112+
let output_id = trait_datum.associated_ty_ids[0];
113+
let alias = AliasTy::Projection(ProjectionTy {
114+
associated_ty_id: output_id,
115+
substitution,
116+
});
117+
let return_type = inputs_and_output.return_type.clone();
118+
builder.push_fact(Normalize {
119+
alias,
120+
ty: return_type,
121+
});
122+
}
123+
},
124+
);
120125
}
121126
}
122127
_ => {}

chalk-solve/src/rust_ir.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,7 @@ pub struct FnDefDatumBound<I: Interner> {
165165
}
166166

167167
pub struct ClosureDatum<I: Interner> {
168-
/// Types of the closure's arguments
169-
pub argument_types: Vec<Ty<I>>,
170-
171-
/// Return type of the closure
172-
pub return_type: Ty<I>,
168+
pub inputs_and_output: Binders<FnDefInputsAndOutputDatum<I>>,
173169

174170
pub kind: ClosureKind,
175171
}

0 commit comments

Comments
 (0)