Normalize closure signature after construction

This commit is contained in:
Michael Goulet 2022-09-12 04:20:26 +00:00
parent fa521a4691
commit 2db0492e62
2 changed files with 39 additions and 0 deletions

View File

@ -624,6 +624,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
), ),
bound_vars, bound_vars,
); );
// Astconv can't normalize inputs or outputs with escaping bound vars,
// so normalize them here, after we've wrapped them in a binder.
let result = self.normalize_associated_types_in(self.tcx.hir().span(hir_id), result);
let c_result = self.inh.infcx.canonicalize_response(result); let c_result = self.inh.infcx.canonicalize_response(result);
self.typeck_results.borrow_mut().user_provided_sigs.insert(expr_def_id, c_result); self.typeck_results.borrow_mut().user_provided_sigs.insert(expr_def_id, c_result);

View File

@ -0,0 +1,36 @@
// check-pass
use std::marker::PhantomData;
#[derive(Default)]
struct MyType<'a> {
field: usize,
_phantom: PhantomData<&'a ()>,
}
#[derive(Default)]
struct MyTypeVariant<'a> {
field: usize,
_phantom: PhantomData<&'a ()>,
}
trait AsVariantTrait {
type Type;
}
impl<'a> AsVariantTrait for MyType<'a> {
type Type = MyTypeVariant<'a>;
}
type Variant<G> = <G as AsVariantTrait>::Type;
fn foo<T: Default, F: FnOnce(T)>(f: F) {
let input = T::default();
f(input);
}
fn main() {
foo(|a: <MyType as AsVariantTrait>::Type| {
a.field;
});
}