Rollup merge of #104732 - WaffleLapkin:from_def_idn't, r=compiler-errors
Refactor `ty::ClosureKind` related stuff I've tried to fix all duplication and weirdness, but if I missed something do tell :p r? `@compiler-errors`
This commit is contained in:
commit
f90484df8a
14 changed files with 46 additions and 62 deletions
|
@ -178,7 +178,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
});
|
});
|
||||||
let kind = object_type
|
let kind = object_type
|
||||||
.principal_def_id()
|
.principal_def_id()
|
||||||
.and_then(|did| self.tcx.fn_trait_kind_from_lang_item(did));
|
.and_then(|did| self.tcx.fn_trait_kind_from_def_id(did));
|
||||||
(sig, kind)
|
(sig, kind)
|
||||||
}
|
}
|
||||||
ty::Infer(ty::TyVar(vid)) => self.deduce_signature_from_predicates(
|
ty::Infer(ty::TyVar(vid)) => self.deduce_signature_from_predicates(
|
||||||
|
@ -235,7 +235,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
if let Some(closure_kind) =
|
if let Some(closure_kind) =
|
||||||
trait_def_id.and_then(|def_id| self.tcx.fn_trait_kind_from_lang_item(def_id))
|
trait_def_id.and_then(|def_id| self.tcx.fn_trait_kind_from_def_id(def_id))
|
||||||
{
|
{
|
||||||
expected_kind = Some(
|
expected_kind = Some(
|
||||||
expected_kind
|
expected_kind
|
||||||
|
@ -263,7 +263,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
let trait_def_id = projection.trait_def_id(tcx);
|
let trait_def_id = projection.trait_def_id(tcx);
|
||||||
|
|
||||||
let is_fn = tcx.fn_trait_kind_from_lang_item(trait_def_id).is_some();
|
let is_fn = tcx.is_fn_trait(trait_def_id);
|
||||||
let gen_trait = tcx.require_lang_item(LangItem::Generator, cause_span);
|
let gen_trait = tcx.require_lang_item(LangItem::Generator, cause_span);
|
||||||
let is_gen = gen_trait == trait_def_id;
|
let is_gen = gen_trait == trait_def_id;
|
||||||
if !is_fn && !is_gen {
|
if !is_fn && !is_gen {
|
||||||
|
|
|
@ -2089,7 +2089,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
&& let maybe_trait_item_def_id = assoc_item.trait_item_def_id.unwrap_or(def_id)
|
&& let maybe_trait_item_def_id = assoc_item.trait_item_def_id.unwrap_or(def_id)
|
||||||
&& let maybe_trait_def_id = self.tcx.parent(maybe_trait_item_def_id)
|
&& let maybe_trait_def_id = self.tcx.parent(maybe_trait_item_def_id)
|
||||||
// Just an easy way to check "trait_def_id == Fn/FnMut/FnOnce"
|
// Just an easy way to check "trait_def_id == Fn/FnMut/FnOnce"
|
||||||
&& let Some(call_kind) = ty::ClosureKind::from_def_id(self.tcx, maybe_trait_def_id)
|
&& let Some(call_kind) = self.tcx.fn_trait_kind_from_def_id(maybe_trait_def_id)
|
||||||
&& let Some(callee_ty) = callee_ty
|
&& let Some(callee_ty) = callee_ty
|
||||||
{
|
{
|
||||||
let callee_ty = callee_ty.peel_refs();
|
let callee_ty = callee_ty.peel_refs();
|
||||||
|
@ -2115,7 +2115,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
{
|
{
|
||||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(pred)) = predicate.kind().skip_binder()
|
if let ty::PredicateKind::Clause(ty::Clause::Trait(pred)) = predicate.kind().skip_binder()
|
||||||
&& pred.self_ty().peel_refs() == callee_ty
|
&& pred.self_ty().peel_refs() == callee_ty
|
||||||
&& ty::ClosureKind::from_def_id(self.tcx, pred.def_id()).is_some()
|
&& self.tcx.is_fn_trait(pred.def_id())
|
||||||
{
|
{
|
||||||
err.span_note(span, "callable defined here");
|
err.span_note(span, "callable defined here");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -399,10 +399,7 @@ impl<'tcx> NiceRegionError<'_, 'tcx> {
|
||||||
self_ty.highlight.maybe_highlighting_region(vid, actual_has_vid);
|
self_ty.highlight.maybe_highlighting_region(vid, actual_has_vid);
|
||||||
|
|
||||||
if self_ty.value.is_closure()
|
if self_ty.value.is_closure()
|
||||||
&& self
|
&& self.tcx().is_fn_trait(expected_trait_ref.value.def_id)
|
||||||
.tcx()
|
|
||||||
.fn_trait_kind_from_lang_item(expected_trait_ref.value.def_id)
|
|
||||||
.is_some()
|
|
||||||
{
|
{
|
||||||
let closure_sig = self_ty.map(|closure| {
|
let closure_sig = self_ty.map(|closure| {
|
||||||
if let ty::Closure(_, substs) = closure.kind() {
|
if let ty::Closure(_, substs) = closure.kind() {
|
||||||
|
|
|
@ -27,7 +27,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fn_trait_kind_from_lang_item(self, id: DefId) -> Option<ty::ClosureKind> {
|
/// Given a [`DefId`] of a [`Fn`], [`FnMut`] or [`FnOnce`] traits,
|
||||||
|
/// returns a corresponding [`ty::ClosureKind`].
|
||||||
|
/// For any other [`DefId`] return `None`.
|
||||||
|
pub fn fn_trait_kind_from_def_id(self, id: DefId) -> Option<ty::ClosureKind> {
|
||||||
let items = self.lang_items();
|
let items = self.lang_items();
|
||||||
match Some(id) {
|
match Some(id) {
|
||||||
x if x == items.fn_trait() => Some(ty::ClosureKind::Fn),
|
x if x == items.fn_trait() => Some(ty::ClosureKind::Fn),
|
||||||
|
@ -36,6 +39,11 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if `id` is a `DefId` of [`Fn`], [`FnMut`] or [`FnOnce`] traits.
|
||||||
|
pub fn is_fn_trait(self, id: DefId) -> bool {
|
||||||
|
self.fn_trait_kind_from_def_id(id).is_some()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the specified `lang_item` must be present for this
|
/// Returns `true` if the specified `lang_item` must be present for this
|
||||||
|
|
|
@ -97,14 +97,20 @@ impl<'tcx> ClosureKind {
|
||||||
/// Returns `true` if a type that impls this closure kind
|
/// Returns `true` if a type that impls this closure kind
|
||||||
/// must also implement `other`.
|
/// must also implement `other`.
|
||||||
pub fn extends(self, other: ty::ClosureKind) -> bool {
|
pub fn extends(self, other: ty::ClosureKind) -> bool {
|
||||||
matches!(
|
self <= other
|
||||||
(self, other),
|
}
|
||||||
(ClosureKind::Fn, ClosureKind::Fn)
|
|
||||||
| (ClosureKind::Fn, ClosureKind::FnMut)
|
/// Converts `self` to a [`DefId`] of the corresponding trait.
|
||||||
| (ClosureKind::Fn, ClosureKind::FnOnce)
|
///
|
||||||
| (ClosureKind::FnMut, ClosureKind::FnMut)
|
/// Note: the inverse of this function is [`TyCtxt::fn_trait_kind_from_def_id`].
|
||||||
| (ClosureKind::FnMut, ClosureKind::FnOnce)
|
pub fn to_def_id(&self, tcx: TyCtxt<'_>) -> DefId {
|
||||||
| (ClosureKind::FnOnce, ClosureKind::FnOnce)
|
tcx.require_lang_item(
|
||||||
|
match self {
|
||||||
|
ClosureKind::Fn => LangItem::Fn,
|
||||||
|
ClosureKind::FnMut => LangItem::FnMut,
|
||||||
|
ClosureKind::FnOnce => LangItem::FnOnce,
|
||||||
|
},
|
||||||
|
None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,29 +123,6 @@ impl<'tcx> ClosureKind {
|
||||||
ClosureKind::FnOnce => tcx.types.i32,
|
ClosureKind::FnOnce => tcx.types.i32,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_def_id(tcx: TyCtxt<'_>, def_id: DefId) -> Option<ClosureKind> {
|
|
||||||
if Some(def_id) == tcx.lang_items().fn_once_trait() {
|
|
||||||
Some(ClosureKind::FnOnce)
|
|
||||||
} else if Some(def_id) == tcx.lang_items().fn_mut_trait() {
|
|
||||||
Some(ClosureKind::FnMut)
|
|
||||||
} else if Some(def_id) == tcx.lang_items().fn_trait() {
|
|
||||||
Some(ClosureKind::Fn)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_def_id(&self, tcx: TyCtxt<'_>) -> DefId {
|
|
||||||
tcx.require_lang_item(
|
|
||||||
match self {
|
|
||||||
ClosureKind::Fn => LangItem::Fn,
|
|
||||||
ClosureKind::FnMut => LangItem::FnMut,
|
|
||||||
ClosureKind::FnOnce => LangItem::FnOnce,
|
|
||||||
},
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A composite describing a `Place` that is captured by a closure.
|
/// A composite describing a `Place` that is captured by a closure.
|
||||||
|
|
|
@ -1080,7 +1080,7 @@ pub trait PrettyPrinter<'tcx>:
|
||||||
let mut resugared = false;
|
let mut resugared = false;
|
||||||
|
|
||||||
// Special-case `Fn(...) -> ...` and re-sugar it.
|
// Special-case `Fn(...) -> ...` and re-sugar it.
|
||||||
let fn_trait_kind = cx.tcx().fn_trait_kind_from_lang_item(principal.def_id);
|
let fn_trait_kind = cx.tcx().fn_trait_kind_from_def_id(principal.def_id);
|
||||||
if !cx.should_print_verbose() && fn_trait_kind.is_some() {
|
if !cx.should_print_verbose() && fn_trait_kind.is_some() {
|
||||||
if let ty::Tuple(tys) = principal.substs.type_at(0).kind() {
|
if let ty::Tuple(tys) = principal.substs.type_at(0).kind() {
|
||||||
let mut projections = predicates.projection_bounds();
|
let mut projections = predicates.projection_bounds();
|
||||||
|
|
|
@ -2116,8 +2116,7 @@ impl<'tcx> Ty<'tcx> {
|
||||||
/// parameter. This is kind of a phantom type, except that the
|
/// parameter. This is kind of a phantom type, except that the
|
||||||
/// most convenient thing for us to are the integral types. This
|
/// most convenient thing for us to are the integral types. This
|
||||||
/// function converts such a special type into the closure
|
/// function converts such a special type into the closure
|
||||||
/// kind. To go the other way, use
|
/// kind. To go the other way, use `closure_kind.to_ty(tcx)`.
|
||||||
/// `tcx.closure_kind_ty(closure_kind)`.
|
|
||||||
///
|
///
|
||||||
/// Note that during type checking, we use an inference variable
|
/// Note that during type checking, we use an inference variable
|
||||||
/// to represent the closure kind, because it has not yet been
|
/// to represent the closure kind, because it has not yet been
|
||||||
|
|
|
@ -37,7 +37,7 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> Body<'
|
||||||
}
|
}
|
||||||
ty::InstanceDef::FnPtrShim(def_id, ty) => {
|
ty::InstanceDef::FnPtrShim(def_id, ty) => {
|
||||||
let trait_ = tcx.trait_of_item(def_id).unwrap();
|
let trait_ = tcx.trait_of_item(def_id).unwrap();
|
||||||
let adjustment = match tcx.fn_trait_kind_from_lang_item(trait_) {
|
let adjustment = match tcx.fn_trait_kind_from_def_id(trait_) {
|
||||||
Some(ty::ClosureKind::FnOnce) => Adjustment::Identity,
|
Some(ty::ClosureKind::FnOnce) => Adjustment::Identity,
|
||||||
Some(ty::ClosureKind::FnMut | ty::ClosureKind::Fn) => Adjustment::Deref,
|
Some(ty::ClosureKind::FnMut | ty::ClosureKind::Fn) => Adjustment::Deref,
|
||||||
None => bug!("fn pointer {:?} is not an fn", ty),
|
None => bug!("fn pointer {:?} is not an fn", ty),
|
||||||
|
|
|
@ -357,7 +357,8 @@ impl<'tcx> InferCtxtExt<'tcx> for InferCtxt<'tcx> {
|
||||||
ocx.register_obligation(obligation);
|
ocx.register_obligation(obligation);
|
||||||
if ocx.select_all_or_error().is_empty() {
|
if ocx.select_all_or_error().is_empty() {
|
||||||
return Ok((
|
return Ok((
|
||||||
ty::ClosureKind::from_def_id(self.tcx, trait_def_id)
|
self.tcx
|
||||||
|
.fn_trait_kind_from_def_id(trait_def_id)
|
||||||
.expect("expected to map DefId to ClosureKind"),
|
.expect("expected to map DefId to ClosureKind"),
|
||||||
ty.rebind(self.resolve_vars_if_possible(var)),
|
ty.rebind(self.resolve_vars_if_possible(var)),
|
||||||
));
|
));
|
||||||
|
@ -686,7 +687,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
ObligationCauseCode::BindingObligation(def_id, _)
|
ObligationCauseCode::BindingObligation(def_id, _)
|
||||||
| ObligationCauseCode::ItemObligation(def_id)
|
| ObligationCauseCode::ItemObligation(def_id)
|
||||||
if ty::ClosureKind::from_def_id(tcx, *def_id).is_some() =>
|
if tcx.is_fn_trait(*def_id) =>
|
||||||
{
|
{
|
||||||
err.code(rustc_errors::error_code!(E0059));
|
err.code(rustc_errors::error_code!(E0059));
|
||||||
err.set_primary_message(format!(
|
err.set_primary_message(format!(
|
||||||
|
@ -846,8 +847,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_fn_trait =
|
let is_fn_trait = tcx.is_fn_trait(trait_ref.def_id());
|
||||||
ty::ClosureKind::from_def_id(tcx, trait_ref.def_id()).is_some();
|
|
||||||
let is_target_feature_fn = if let ty::FnDef(def_id, _) =
|
let is_target_feature_fn = if let ty::FnDef(def_id, _) =
|
||||||
*trait_ref.skip_binder().self_ty().kind()
|
*trait_ref.skip_binder().self_ty().kind()
|
||||||
{
|
{
|
||||||
|
@ -877,7 +877,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
// Note if the `FnMut` or `FnOnce` is less general than the trait we're trying
|
// Note if the `FnMut` or `FnOnce` is less general than the trait we're trying
|
||||||
// to implement.
|
// to implement.
|
||||||
let selected_kind =
|
let selected_kind =
|
||||||
ty::ClosureKind::from_def_id(self.tcx, trait_ref.def_id())
|
self.tcx.fn_trait_kind_from_def_id(trait_ref.def_id())
|
||||||
.expect("expected to map DefId to ClosureKind");
|
.expect("expected to map DefId to ClosureKind");
|
||||||
if !implemented_kind.extends(selected_kind) {
|
if !implemented_kind.extends(selected_kind) {
|
||||||
err.note(
|
err.note(
|
||||||
|
@ -2155,7 +2155,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
if generics.params.iter().any(|p| p.name != kw::SelfUpper)
|
if generics.params.iter().any(|p| p.name != kw::SelfUpper)
|
||||||
&& !snippet.ends_with('>')
|
&& !snippet.ends_with('>')
|
||||||
&& !generics.has_impl_trait()
|
&& !generics.has_impl_trait()
|
||||||
&& !self.tcx.fn_trait_kind_from_lang_item(def_id).is_some()
|
&& !self.tcx.is_fn_trait(def_id)
|
||||||
{
|
{
|
||||||
// FIXME: To avoid spurious suggestions in functions where type arguments
|
// FIXME: To avoid spurious suggestions in functions where type arguments
|
||||||
// where already supplied, we check the snippet to make sure it doesn't
|
// where already supplied, we check the snippet to make sure it doesn't
|
||||||
|
|
|
@ -1679,9 +1679,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
) -> Ty<'tcx> {
|
) -> Ty<'tcx> {
|
||||||
let inputs = trait_ref.skip_binder().substs.type_at(1);
|
let inputs = trait_ref.skip_binder().substs.type_at(1);
|
||||||
let sig = match inputs.kind() {
|
let sig = match inputs.kind() {
|
||||||
ty::Tuple(inputs)
|
ty::Tuple(inputs) if infcx.tcx.is_fn_trait(trait_ref.def_id()) => {
|
||||||
if infcx.tcx.fn_trait_kind_from_lang_item(trait_ref.def_id()).is_some() =>
|
|
||||||
{
|
|
||||||
infcx.tcx.mk_fn_sig(
|
infcx.tcx.mk_fn_sig(
|
||||||
inputs.iter(),
|
inputs.iter(),
|
||||||
infcx.next_ty_var(TypeVariableOrigin {
|
infcx.next_ty_var(TypeVariableOrigin {
|
||||||
|
@ -1752,7 +1750,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
&& let predicates = self.tcx.predicates_of(def_id).instantiate_identity(self.tcx)
|
&& let predicates = self.tcx.predicates_of(def_id).instantiate_identity(self.tcx)
|
||||||
&& let Some(pred) = predicates.predicates.get(*idx)
|
&& let Some(pred) = predicates.predicates.get(*idx)
|
||||||
&& let ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred)) = pred.kind().skip_binder()
|
&& let ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred)) = pred.kind().skip_binder()
|
||||||
&& ty::ClosureKind::from_def_id(self.tcx, trait_pred.def_id()).is_some()
|
&& self.tcx.is_fn_trait(trait_pred.def_id())
|
||||||
{
|
{
|
||||||
let expected_self =
|
let expected_self =
|
||||||
self.tcx.anonymize_late_bound_regions(pred.kind().rebind(trait_pred.self_ty()));
|
self.tcx.anonymize_late_bound_regions(pred.kind().rebind(trait_pred.self_ty()));
|
||||||
|
@ -1766,8 +1764,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.find(|(other_idx, (pred, _))| match pred.kind().skip_binder() {
|
.find(|(other_idx, (pred, _))| match pred.kind().skip_binder() {
|
||||||
ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred))
|
ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred))
|
||||||
if ty::ClosureKind::from_def_id(self.tcx, trait_pred.def_id())
|
if self.tcx.is_fn_trait(trait_pred.def_id())
|
||||||
.is_some()
|
|
||||||
&& other_idx != idx
|
&& other_idx != idx
|
||||||
// Make sure that the self type matches
|
// Make sure that the self type matches
|
||||||
// (i.e. constraining this closure)
|
// (i.e. constraining this closure)
|
||||||
|
|
|
@ -451,7 +451,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
obligation: &TraitObligation<'tcx>,
|
obligation: &TraitObligation<'tcx>,
|
||||||
candidates: &mut SelectionCandidateSet<'tcx>,
|
candidates: &mut SelectionCandidateSet<'tcx>,
|
||||||
) {
|
) {
|
||||||
let Some(kind) = self.tcx().fn_trait_kind_from_lang_item(obligation.predicate.def_id()) else {
|
let Some(kind) = self.tcx().fn_trait_kind_from_def_id(obligation.predicate.def_id()) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
candidates: &mut SelectionCandidateSet<'tcx>,
|
candidates: &mut SelectionCandidateSet<'tcx>,
|
||||||
) {
|
) {
|
||||||
// We provide impl of all fn traits for fn pointers.
|
// We provide impl of all fn traits for fn pointers.
|
||||||
if self.tcx().fn_trait_kind_from_lang_item(obligation.predicate.def_id()).is_none() {
|
if !self.tcx().is_fn_trait(obligation.predicate.def_id()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -735,7 +735,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
) -> Result<ImplSourceClosureData<'tcx, PredicateObligation<'tcx>>, SelectionError<'tcx>> {
|
) -> Result<ImplSourceClosureData<'tcx, PredicateObligation<'tcx>>, SelectionError<'tcx>> {
|
||||||
let kind = self
|
let kind = self
|
||||||
.tcx()
|
.tcx()
|
||||||
.fn_trait_kind_from_lang_item(obligation.predicate.def_id())
|
.fn_trait_kind_from_def_id(obligation.predicate.def_id())
|
||||||
.unwrap_or_else(|| bug!("closure candidate for non-fn trait {:?}", obligation));
|
.unwrap_or_else(|| bug!("closure candidate for non-fn trait {:?}", obligation));
|
||||||
|
|
||||||
// Okay to skip binder because the substs on closure types never
|
// Okay to skip binder because the substs on closure types never
|
||||||
|
|
|
@ -209,7 +209,7 @@ fn resolve_associated_item<'tcx>(
|
||||||
substs: future_data.substs,
|
substs: future_data.substs,
|
||||||
}),
|
}),
|
||||||
traits::ImplSource::Closure(closure_data) => {
|
traits::ImplSource::Closure(closure_data) => {
|
||||||
let trait_closure_kind = tcx.fn_trait_kind_from_lang_item(trait_id).unwrap();
|
let trait_closure_kind = tcx.fn_trait_kind_from_def_id(trait_id).unwrap();
|
||||||
Instance::resolve_closure(
|
Instance::resolve_closure(
|
||||||
tcx,
|
tcx,
|
||||||
closure_data.closure_def_id,
|
closure_data.closure_def_id,
|
||||||
|
|
|
@ -106,7 +106,7 @@ fn external_generic_args<'tcx>(
|
||||||
) -> GenericArgs {
|
) -> GenericArgs {
|
||||||
let args = substs_to_args(cx, substs, has_self);
|
let args = substs_to_args(cx, substs, has_self);
|
||||||
|
|
||||||
if cx.tcx.fn_trait_kind_from_lang_item(did).is_some() {
|
if cx.tcx.fn_trait_kind_from_def_id(did).is_some() {
|
||||||
let inputs =
|
let inputs =
|
||||||
// The trait's first substitution is the one after self, if there is one.
|
// The trait's first substitution is the one after self, if there is one.
|
||||||
match substs.iter().nth(if has_self { 1 } else { 0 }).unwrap().expect_ty().kind() {
|
match substs.iter().nth(if has_self { 1 } else { 0 }).unwrap().expect_ty().kind() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue