Normalize signature when deducing closure signature from supertraits
This commit is contained in:
parent
1286ee23e4
commit
9a1043eac7
2 changed files with 24 additions and 3 deletions
|
@ -10,6 +10,7 @@ use rustc_hir_analysis::astconv::AstConv;
|
|||
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||
use rustc_infer::infer::LateBoundRegionConversionTime;
|
||||
use rustc_infer::infer::{InferOk, InferResult};
|
||||
use rustc_macros::{TypeFoldable, TypeVisitable};
|
||||
use rustc_middle::ty::subst::InternalSubsts;
|
||||
use rustc_middle::ty::visit::TypeVisitable;
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
|
@ -22,7 +23,7 @@ use std::cmp;
|
|||
use std::iter;
|
||||
|
||||
/// What signature do we *expect* the closure to have from context?
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone, TypeFoldable, TypeVisitable)]
|
||||
struct ExpectedSig<'tcx> {
|
||||
/// Span that gave us this expectation, if we know that.
|
||||
cause_span: Option<Span>,
|
||||
|
@ -241,9 +242,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
if expected_sig.is_none()
|
||||
&& let ty::PredicateKind::Projection(proj_predicate) = bound_predicate.skip_binder()
|
||||
{
|
||||
expected_sig = self.deduce_sig_from_projection(
|
||||
expected_sig = self.normalize_associated_types_in(
|
||||
obligation.cause.span,
|
||||
self.deduce_sig_from_projection(
|
||||
Some(obligation.cause.span),
|
||||
bound_predicate.rebind(proj_predicate),
|
||||
bound_predicate.rebind(proj_predicate),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
17
src/test/ui/closures/supertrait-hint-references-assoc-ty.rs
Normal file
17
src/test/ui/closures/supertrait-hint-references-assoc-ty.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
// check-pass
|
||||
|
||||
pub trait Fn0: Fn(i32) -> Self::Out {
|
||||
type Out;
|
||||
}
|
||||
|
||||
impl<F: Fn(i32) -> ()> Fn0 for F {
|
||||
type Out = ();
|
||||
}
|
||||
|
||||
pub fn closure_typer(_: impl Fn0) {}
|
||||
|
||||
fn main() {
|
||||
closure_typer(move |x| {
|
||||
let _: i64 = x.into();
|
||||
});
|
||||
}
|
Loading…
Add table
Reference in a new issue