Skip to content

Commit

Permalink
Auto merge of #101708 - compiler-errors:issue-101696, r=jackh726
Browse files Browse the repository at this point in the history
Normalize closure signature after construction

Astconv can't normalize inputs or outputs with escaping bound vars ([see this](https://doc.rust-lang.org/nightly/nightly-rustc/src/rustc_typeck/check/fn_ctxt/mod.rs.html#294)), so normalize them after we've wrapped them in a binder.

Fixes #101696
  • Loading branch information
bors committed Sep 23, 2022
2 parents e7119a0 + 2db0492 commit 9279c54
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
3 changes: 3 additions & 0 deletions compiler/rustc_typeck/src/check/closure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
),
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);
self.typeck_results.borrow_mut().user_provided_sigs.insert(expr_def_id, c_result);
Expand Down
36 changes: 36 additions & 0 deletions src/test/ui/closures/issue-101696.rs
Original file line number Diff line number Diff line change
@@ -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;
});
}

0 comments on commit 9279c54

Please sign in to comment.