Rollup merge of #123900 - compiler-errors:nobound, r=lcnr
Stop using `PolyTraitRef` for closure/coroutine predicates already instantiated w placeholders r? lcnr
This commit is contained in:
commit
314dee528b
10 changed files with 39 additions and 61 deletions
|
@ -367,7 +367,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}),
|
}),
|
||||||
) = error.code
|
) = error.code
|
||||||
&& let ty::Closure(def_id, _) | ty::Coroutine(def_id, ..) =
|
&& let ty::Closure(def_id, _) | ty::Coroutine(def_id, ..) =
|
||||||
expected_trait_ref.skip_binder().self_ty().kind()
|
expected_trait_ref.self_ty().kind()
|
||||||
&& span.overlaps(self.tcx.def_span(*def_id))
|
&& span.overlaps(self.tcx.def_span(*def_id))
|
||||||
{
|
{
|
||||||
true
|
true
|
||||||
|
|
|
@ -424,25 +424,7 @@ impl<'tcx> ToTrace<'tcx> for ty::TraitRef<'tcx> {
|
||||||
) -> TypeTrace<'tcx> {
|
) -> TypeTrace<'tcx> {
|
||||||
TypeTrace {
|
TypeTrace {
|
||||||
cause: cause.clone(),
|
cause: cause.clone(),
|
||||||
values: PolyTraitRefs(ExpectedFound::new(
|
values: TraitRefs(ExpectedFound::new(a_is_expected, a, b)),
|
||||||
a_is_expected,
|
|
||||||
ty::Binder::dummy(a),
|
|
||||||
ty::Binder::dummy(b),
|
|
||||||
)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> ToTrace<'tcx> for ty::PolyTraitRef<'tcx> {
|
|
||||||
fn to_trace(
|
|
||||||
cause: &ObligationCause<'tcx>,
|
|
||||||
a_is_expected: bool,
|
|
||||||
a: Self,
|
|
||||||
b: Self,
|
|
||||||
) -> TypeTrace<'tcx> {
|
|
||||||
TypeTrace {
|
|
||||||
cause: cause.clone(),
|
|
||||||
values: PolyTraitRefs(ExpectedFound::new(a_is_expected, a, b)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1653,7 +1653,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
.report(diag);
|
.report(diag);
|
||||||
(false, Mismatch::Fixed("signature"))
|
(false, Mismatch::Fixed("signature"))
|
||||||
}
|
}
|
||||||
ValuePairs::PolyTraitRefs(_) => (false, Mismatch::Fixed("trait")),
|
ValuePairs::TraitRefs(_) => (false, Mismatch::Fixed("trait")),
|
||||||
ValuePairs::Aliases(infer::ExpectedFound { expected, .. }) => {
|
ValuePairs::Aliases(infer::ExpectedFound { expected, .. }) => {
|
||||||
(false, Mismatch::Fixed(self.tcx.def_descr(expected.def_id)))
|
(false, Mismatch::Fixed(self.tcx.def_descr(expected.def_id)))
|
||||||
}
|
}
|
||||||
|
@ -1969,8 +1969,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
self.note_and_explain_type_err(diag, exp_found, cause, span, cause.body_id.to_def_id());
|
self.note_and_explain_type_err(diag, exp_found, cause, span, cause.body_id.to_def_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ValuePairs::PolyTraitRefs(exp_found)) = values
|
if let Some(ValuePairs::TraitRefs(exp_found)) = values
|
||||||
&& let ty::Closure(def_id, _) = exp_found.expected.skip_binder().self_ty().kind()
|
&& let ty::Closure(def_id, _) = exp_found.expected.self_ty().kind()
|
||||||
&& let Some(def_id) = def_id.as_local()
|
&& let Some(def_id) = def_id.as_local()
|
||||||
&& terr.involves_regions()
|
&& terr.involves_regions()
|
||||||
{
|
{
|
||||||
|
@ -2188,7 +2188,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
infer::Aliases(exp_found) => self.expected_found_str(exp_found),
|
infer::Aliases(exp_found) => self.expected_found_str(exp_found),
|
||||||
infer::ExistentialTraitRef(exp_found) => self.expected_found_str(exp_found),
|
infer::ExistentialTraitRef(exp_found) => self.expected_found_str(exp_found),
|
||||||
infer::ExistentialProjection(exp_found) => self.expected_found_str(exp_found),
|
infer::ExistentialProjection(exp_found) => self.expected_found_str(exp_found),
|
||||||
infer::PolyTraitRefs(exp_found) => {
|
infer::TraitRefs(exp_found) => {
|
||||||
let pretty_exp_found = ty::error::ExpectedFound {
|
let pretty_exp_found = ty::error::ExpectedFound {
|
||||||
expected: exp_found.expected.print_trait_sugared(),
|
expected: exp_found.expected.print_trait_sugared(),
|
||||||
found: exp_found.found.print_trait_sugared(),
|
found: exp_found.found.print_trait_sugared(),
|
||||||
|
|
|
@ -195,13 +195,13 @@ impl<'tcx> NiceRegionError<'_, 'tcx> {
|
||||||
value_pairs: &ValuePairs<'tcx>,
|
value_pairs: &ValuePairs<'tcx>,
|
||||||
) -> Option<Diag<'tcx>> {
|
) -> Option<Diag<'tcx>> {
|
||||||
let (expected_args, found_args, trait_def_id) = match value_pairs {
|
let (expected_args, found_args, trait_def_id) = match value_pairs {
|
||||||
ValuePairs::PolyTraitRefs(ExpectedFound { expected, found })
|
ValuePairs::TraitRefs(ExpectedFound { expected, found })
|
||||||
if expected.def_id() == found.def_id() =>
|
if expected.def_id == found.def_id =>
|
||||||
{
|
{
|
||||||
// It's possible that the placeholders come from a binder
|
// It's possible that the placeholders come from a binder
|
||||||
// outside of this value pair. Use `no_bound_vars` as a
|
// outside of this value pair. Use `no_bound_vars` as a
|
||||||
// simple heuristic for that.
|
// simple heuristic for that.
|
||||||
(expected.no_bound_vars()?.args, found.no_bound_vars()?.args, expected.def_id())
|
(expected.args, found.args, expected.def_id)
|
||||||
}
|
}
|
||||||
_ => return None,
|
_ => return None,
|
||||||
};
|
};
|
||||||
|
|
|
@ -599,7 +599,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
&self,
|
&self,
|
||||||
span: Span,
|
span: Span,
|
||||||
hir: hir::Node<'_>,
|
hir: hir::Node<'_>,
|
||||||
exp_found: &ty::error::ExpectedFound<ty::PolyTraitRef<'tcx>>,
|
exp_found: &ty::error::ExpectedFound<ty::TraitRef<'tcx>>,
|
||||||
diag: &mut Diag<'_>,
|
diag: &mut Diag<'_>,
|
||||||
) {
|
) {
|
||||||
// 0. Extract fn_decl from hir
|
// 0. Extract fn_decl from hir
|
||||||
|
@ -614,10 +614,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
|
|
||||||
// 1. Get the args of the closure.
|
// 1. Get the args of the closure.
|
||||||
// 2. Assume exp_found is FnOnce / FnMut / Fn, we can extract function parameters from [1].
|
// 2. Assume exp_found is FnOnce / FnMut / Fn, we can extract function parameters from [1].
|
||||||
let Some(expected) = exp_found.expected.skip_binder().args.get(1) else {
|
let Some(expected) = exp_found.expected.args.get(1) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let Some(found) = exp_found.found.skip_binder().args.get(1) else {
|
let Some(found) = exp_found.found.args.get(1) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let expected = expected.unpack();
|
let expected = expected.unpack();
|
||||||
|
|
|
@ -403,7 +403,7 @@ pub enum ValuePairs<'tcx> {
|
||||||
Regions(ExpectedFound<ty::Region<'tcx>>),
|
Regions(ExpectedFound<ty::Region<'tcx>>),
|
||||||
Terms(ExpectedFound<ty::Term<'tcx>>),
|
Terms(ExpectedFound<ty::Term<'tcx>>),
|
||||||
Aliases(ExpectedFound<ty::AliasTy<'tcx>>),
|
Aliases(ExpectedFound<ty::AliasTy<'tcx>>),
|
||||||
PolyTraitRefs(ExpectedFound<ty::PolyTraitRef<'tcx>>),
|
TraitRefs(ExpectedFound<ty::TraitRef<'tcx>>),
|
||||||
PolySigs(ExpectedFound<ty::PolyFnSig<'tcx>>),
|
PolySigs(ExpectedFound<ty::PolyFnSig<'tcx>>),
|
||||||
ExistentialTraitRef(ExpectedFound<ty::PolyExistentialTraitRef<'tcx>>),
|
ExistentialTraitRef(ExpectedFound<ty::PolyExistentialTraitRef<'tcx>>),
|
||||||
ExistentialProjection(ExpectedFound<ty::PolyExistentialProjection<'tcx>>),
|
ExistentialProjection(ExpectedFound<ty::PolyExistentialProjection<'tcx>>),
|
||||||
|
@ -1882,15 +1882,15 @@ impl<'tcx> TypeTrace<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn poly_trait_refs(
|
pub fn trait_refs(
|
||||||
cause: &ObligationCause<'tcx>,
|
cause: &ObligationCause<'tcx>,
|
||||||
a_is_expected: bool,
|
a_is_expected: bool,
|
||||||
a: ty::PolyTraitRef<'tcx>,
|
a: ty::TraitRef<'tcx>,
|
||||||
b: ty::PolyTraitRef<'tcx>,
|
b: ty::TraitRef<'tcx>,
|
||||||
) -> TypeTrace<'tcx> {
|
) -> TypeTrace<'tcx> {
|
||||||
TypeTrace {
|
TypeTrace {
|
||||||
cause: cause.clone(),
|
cause: cause.clone(),
|
||||||
values: PolyTraitRefs(ExpectedFound::new(a_is_expected, a, b)),
|
values: TraitRefs(ExpectedFound::new(a_is_expected, a, b)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -620,11 +620,10 @@ pub enum SelectionError<'tcx> {
|
||||||
OpaqueTypeAutoTraitLeakageUnknown(DefId),
|
OpaqueTypeAutoTraitLeakageUnknown(DefId),
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(@lcnr): The `Binder` here should be unnecessary. Just use `TraitRef` instead.
|
|
||||||
#[derive(Clone, Debug, TypeVisitable)]
|
#[derive(Clone, Debug, TypeVisitable)]
|
||||||
pub struct SignatureMismatchData<'tcx> {
|
pub struct SignatureMismatchData<'tcx> {
|
||||||
pub found_trait_ref: ty::PolyTraitRef<'tcx>,
|
pub found_trait_ref: ty::TraitRef<'tcx>,
|
||||||
pub expected_trait_ref: ty::PolyTraitRef<'tcx>,
|
pub expected_trait_ref: ty::TraitRef<'tcx>,
|
||||||
pub terr: ty::error::TypeError<'tcx>,
|
pub terr: ty::error::TypeError<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1879,19 +1879,19 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
&self,
|
&self,
|
||||||
span: Span,
|
span: Span,
|
||||||
found_span: Option<Span>,
|
found_span: Option<Span>,
|
||||||
found: ty::PolyTraitRef<'tcx>,
|
found: ty::TraitRef<'tcx>,
|
||||||
expected: ty::PolyTraitRef<'tcx>,
|
expected: ty::TraitRef<'tcx>,
|
||||||
cause: &ObligationCauseCode<'tcx>,
|
cause: &ObligationCauseCode<'tcx>,
|
||||||
found_node: Option<Node<'_>>,
|
found_node: Option<Node<'_>>,
|
||||||
param_env: ty::ParamEnv<'tcx>,
|
param_env: ty::ParamEnv<'tcx>,
|
||||||
) -> Diag<'tcx> {
|
) -> Diag<'tcx> {
|
||||||
pub(crate) fn build_fn_sig_ty<'tcx>(
|
pub(crate) fn build_fn_sig_ty<'tcx>(
|
||||||
infcx: &InferCtxt<'tcx>,
|
infcx: &InferCtxt<'tcx>,
|
||||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
trait_ref: ty::TraitRef<'tcx>,
|
||||||
) -> Ty<'tcx> {
|
) -> Ty<'tcx> {
|
||||||
let inputs = trait_ref.skip_binder().args.type_at(1);
|
let inputs = trait_ref.args.type_at(1);
|
||||||
let sig = match inputs.kind() {
|
let sig = match inputs.kind() {
|
||||||
ty::Tuple(inputs) if infcx.tcx.is_fn_trait(trait_ref.def_id()) => {
|
ty::Tuple(inputs) if infcx.tcx.is_fn_trait(trait_ref.def_id) => {
|
||||||
infcx.tcx.mk_fn_sig(
|
infcx.tcx.mk_fn_sig(
|
||||||
*inputs,
|
*inputs,
|
||||||
infcx.next_ty_var(TypeVariableOrigin {
|
infcx.next_ty_var(TypeVariableOrigin {
|
||||||
|
@ -1915,10 +1915,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ty::new_fn_ptr(infcx.tcx, trait_ref.rebind(sig))
|
Ty::new_fn_ptr(infcx.tcx, ty::Binder::dummy(sig))
|
||||||
}
|
}
|
||||||
|
|
||||||
let argument_kind = match expected.skip_binder().self_ty().kind() {
|
let argument_kind = match expected.self_ty().kind() {
|
||||||
ty::Closure(..) => "closure",
|
ty::Closure(..) => "closure",
|
||||||
ty::Coroutine(..) => "coroutine",
|
ty::Coroutine(..) => "coroutine",
|
||||||
_ => "function",
|
_ => "function",
|
||||||
|
|
|
@ -3380,11 +3380,11 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
fn report_cyclic_signature_error(
|
fn report_cyclic_signature_error(
|
||||||
&self,
|
&self,
|
||||||
obligation: &PredicateObligation<'tcx>,
|
obligation: &PredicateObligation<'tcx>,
|
||||||
found_trait_ref: ty::Binder<'tcx, ty::TraitRef<'tcx>>,
|
found_trait_ref: ty::TraitRef<'tcx>,
|
||||||
expected_trait_ref: ty::Binder<'tcx, ty::TraitRef<'tcx>>,
|
expected_trait_ref: ty::TraitRef<'tcx>,
|
||||||
terr: TypeError<'tcx>,
|
terr: TypeError<'tcx>,
|
||||||
) -> Diag<'tcx> {
|
) -> Diag<'tcx> {
|
||||||
let self_ty = found_trait_ref.self_ty().skip_binder();
|
let self_ty = found_trait_ref.self_ty();
|
||||||
let (cause, terr) = if let ty::Closure(def_id, _) = self_ty.kind() {
|
let (cause, terr) = if let ty::Closure(def_id, _) = self_ty.kind() {
|
||||||
(
|
(
|
||||||
ObligationCause::dummy_with_span(self.tcx.def_span(def_id)),
|
ObligationCause::dummy_with_span(self.tcx.def_span(def_id)),
|
||||||
|
@ -3394,7 +3394,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
(obligation.cause.clone(), terr)
|
(obligation.cause.clone(), terr)
|
||||||
};
|
};
|
||||||
self.report_and_explain_type_error(
|
self.report_and_explain_type_error(
|
||||||
TypeTrace::poly_trait_refs(&cause, true, expected_trait_ref, found_trait_ref),
|
TypeTrace::trait_refs(&cause, true, expected_trait_ref, found_trait_ref),
|
||||||
terr,
|
terr,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -3434,17 +3434,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
&self,
|
&self,
|
||||||
obligation: &PredicateObligation<'tcx>,
|
obligation: &PredicateObligation<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
found_trait_ref: ty::Binder<'tcx, ty::TraitRef<'tcx>>,
|
found_trait_ref: ty::TraitRef<'tcx>,
|
||||||
expected_trait_ref: ty::Binder<'tcx, ty::TraitRef<'tcx>>,
|
expected_trait_ref: ty::TraitRef<'tcx>,
|
||||||
) -> Result<Diag<'tcx>, ErrorGuaranteed> {
|
) -> Result<Diag<'tcx>, ErrorGuaranteed> {
|
||||||
let found_trait_ref = self.resolve_vars_if_possible(found_trait_ref);
|
let found_trait_ref = self.resolve_vars_if_possible(found_trait_ref);
|
||||||
let expected_trait_ref = self.resolve_vars_if_possible(expected_trait_ref);
|
let expected_trait_ref = self.resolve_vars_if_possible(expected_trait_ref);
|
||||||
|
|
||||||
expected_trait_ref.self_ty().error_reported()?;
|
expected_trait_ref.self_ty().error_reported()?;
|
||||||
|
let found_trait_ty = found_trait_ref.self_ty();
|
||||||
let Some(found_trait_ty) = found_trait_ref.self_ty().no_bound_vars() else {
|
|
||||||
self.dcx().bug("bound vars outside binder");
|
|
||||||
};
|
|
||||||
|
|
||||||
let found_did = match *found_trait_ty.kind() {
|
let found_did = match *found_trait_ty.kind() {
|
||||||
ty::Closure(did, _) | ty::FnDef(did, _) | ty::Coroutine(did, ..) => Some(did),
|
ty::Closure(did, _) | ty::FnDef(did, _) | ty::Coroutine(did, ..) => Some(did),
|
||||||
|
@ -3462,7 +3459,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
|
|
||||||
let mut not_tupled = false;
|
let mut not_tupled = false;
|
||||||
|
|
||||||
let found = match found_trait_ref.skip_binder().args.type_at(1).kind() {
|
let found = match found_trait_ref.args.type_at(1).kind() {
|
||||||
ty::Tuple(tys) => vec![ArgKind::empty(); tys.len()],
|
ty::Tuple(tys) => vec![ArgKind::empty(); tys.len()],
|
||||||
_ => {
|
_ => {
|
||||||
not_tupled = true;
|
not_tupled = true;
|
||||||
|
@ -3470,7 +3467,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let expected_ty = expected_trait_ref.skip_binder().args.type_at(1);
|
let expected_ty = expected_trait_ref.args.type_at(1);
|
||||||
let expected = match expected_ty.kind() {
|
let expected = match expected_ty.kind() {
|
||||||
ty::Tuple(tys) => {
|
ty::Tuple(tys) => {
|
||||||
tys.iter().map(|t| ArgKind::from_expected_ty(t, Some(span))).collect()
|
tys.iter().map(|t| ArgKind::from_expected_ty(t, Some(span))).collect()
|
||||||
|
@ -3487,11 +3484,11 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
// traits manually, but don't make it more confusing when it does
|
// traits manually, but don't make it more confusing when it does
|
||||||
// happen.
|
// happen.
|
||||||
Ok(
|
Ok(
|
||||||
if Some(expected_trait_ref.def_id()) != self.tcx.lang_items().coroutine_trait()
|
if Some(expected_trait_ref.def_id) != self.tcx.lang_items().coroutine_trait()
|
||||||
&& not_tupled
|
&& not_tupled
|
||||||
{
|
{
|
||||||
self.report_and_explain_type_error(
|
self.report_and_explain_type_error(
|
||||||
TypeTrace::poly_trait_refs(
|
TypeTrace::trait_refs(
|
||||||
&obligation.cause,
|
&obligation.cause,
|
||||||
true,
|
true,
|
||||||
expected_trait_ref,
|
expected_trait_ref,
|
||||||
|
|
|
@ -1079,8 +1079,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
})
|
})
|
||||||
.map_err(|terr| {
|
.map_err(|terr| {
|
||||||
SignatureMismatch(Box::new(SignatureMismatchData {
|
SignatureMismatch(Box::new(SignatureMismatchData {
|
||||||
expected_trait_ref: ty::Binder::dummy(obligation_trait_ref),
|
expected_trait_ref: obligation_trait_ref,
|
||||||
found_trait_ref: ty::Binder::dummy(found_trait_ref),
|
found_trait_ref,
|
||||||
terr,
|
terr,
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue