Make ClosureOutlivesRequirement not rely on an unresolved type
This commit is contained in:
parent
91af4f5d0b
commit
a6b5f95fb0
20 changed files with 94 additions and 93 deletions
|
@ -92,7 +92,7 @@ pub struct OutlivesConstraint<'tcx> {
|
|||
pub span: Span,
|
||||
|
||||
/// What caused this constraint?
|
||||
pub category: ConstraintCategory<'tcx>,
|
||||
pub category: ConstraintCategory,
|
||||
|
||||
/// Variance diagnostic information
|
||||
pub variance_info: VarianceDiagInfo<'tcx>,
|
||||
|
|
|
@ -976,7 +976,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
err: &mut Diagnostic,
|
||||
location: Location,
|
||||
issued_borrow: &BorrowData<'tcx>,
|
||||
explanation: BorrowExplanation<'tcx>,
|
||||
explanation: BorrowExplanation,
|
||||
) {
|
||||
let used_in_call = matches!(
|
||||
explanation,
|
||||
|
@ -1326,7 +1326,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
borrow: &BorrowData<'tcx>,
|
||||
drop_span: Span,
|
||||
borrow_spans: UseSpans<'tcx>,
|
||||
explanation: BorrowExplanation<'tcx>,
|
||||
explanation: BorrowExplanation,
|
||||
) -> DiagnosticBuilder<'cx, ErrorGuaranteed> {
|
||||
debug!(
|
||||
"report_local_value_does_not_live_long_enough(\
|
||||
|
@ -1532,7 +1532,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
drop_span: Span,
|
||||
borrow_spans: UseSpans<'tcx>,
|
||||
proper_span: Span,
|
||||
explanation: BorrowExplanation<'tcx>,
|
||||
explanation: BorrowExplanation,
|
||||
) -> DiagnosticBuilder<'cx, ErrorGuaranteed> {
|
||||
if let BorrowExplanation::MustBeValidFor { category, span, from_closure: false, .. } =
|
||||
explanation
|
||||
|
@ -1646,7 +1646,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
borrow: &BorrowData<'tcx>,
|
||||
borrow_span: Span,
|
||||
return_span: Span,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
opt_place_desc: Option<&String>,
|
||||
) -> Option<DiagnosticBuilder<'cx, ErrorGuaranteed>> {
|
||||
let return_kind = match category {
|
||||
|
@ -1741,7 +1741,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
use_span: UseSpans<'tcx>,
|
||||
var_span: Span,
|
||||
fr_name: &RegionName,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
constraint_span: Span,
|
||||
captured_var: &str,
|
||||
) -> DiagnosticBuilder<'cx, ErrorGuaranteed> {
|
||||
|
|
|
@ -21,7 +21,7 @@ use crate::{
|
|||
use super::{find_use, RegionName, UseSpans};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) enum BorrowExplanation<'tcx> {
|
||||
pub(crate) enum BorrowExplanation {
|
||||
UsedLater(LaterUseKind, Span, Option<Span>),
|
||||
UsedLaterInLoop(LaterUseKind, Span, Option<Span>),
|
||||
UsedLaterWhenDropped {
|
||||
|
@ -30,7 +30,7 @@ pub(crate) enum BorrowExplanation<'tcx> {
|
|||
should_note_order: bool,
|
||||
},
|
||||
MustBeValidFor {
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
from_closure: bool,
|
||||
span: Span,
|
||||
region_name: RegionName,
|
||||
|
@ -49,7 +49,7 @@ pub(crate) enum LaterUseKind {
|
|||
Other,
|
||||
}
|
||||
|
||||
impl<'tcx> BorrowExplanation<'tcx> {
|
||||
impl<'tcx> BorrowExplanation {
|
||||
pub(crate) fn is_explained(&self) -> bool {
|
||||
!matches!(self, BorrowExplanation::Unexplained)
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ impl<'tcx> BorrowExplanation<'tcx> {
|
|||
fn add_lifetime_bound_suggestion_to_diagnostic(
|
||||
&self,
|
||||
err: &mut Diagnostic,
|
||||
category: &ConstraintCategory<'tcx>,
|
||||
category: &ConstraintCategory,
|
||||
span: Span,
|
||||
region_name: &RegionName,
|
||||
) {
|
||||
|
@ -316,7 +316,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
&self,
|
||||
borrow_region: RegionVid,
|
||||
outlived_region: RegionVid,
|
||||
) -> (ConstraintCategory<'tcx>, bool, Span, Option<RegionName>, Vec<ExtraConstraintInfo>) {
|
||||
) -> (ConstraintCategory, bool, Span, Option<RegionName>, Vec<ExtraConstraintInfo>) {
|
||||
let (blame_constraint, extra_info) = self.regioncx.best_blame_constraint(
|
||||
borrow_region,
|
||||
NllRegionVariableOrigin::FreeRegion,
|
||||
|
@ -348,7 +348,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
location: Location,
|
||||
borrow: &BorrowData<'tcx>,
|
||||
kind_place: Option<(WriteKind, Place<'tcx>)>,
|
||||
) -> BorrowExplanation<'tcx> {
|
||||
) -> BorrowExplanation {
|
||||
let regioncx = &self.regioncx;
|
||||
let body: &Body<'_> = &self.body;
|
||||
let tcx = self.infcx.tcx;
|
||||
|
|
|
@ -161,7 +161,7 @@ impl OutlivesSuggestionBuilder {
|
|||
pub(crate) fn intermediate_suggestion(
|
||||
&mut self,
|
||||
mbcx: &MirBorrowckCtxt<'_, '_>,
|
||||
errci: &ErrorConstraintInfo<'_>,
|
||||
errci: &ErrorConstraintInfo,
|
||||
diag: &mut Diagnostic,
|
||||
) {
|
||||
// Emit an intermediate note.
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
//! Error reporting machinery for lifetime errors.
|
||||
|
||||
use either::Either;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed, MultiSpan};
|
||||
use rustc_hir::def_id::DefId;
|
||||
|
@ -16,7 +17,7 @@ use rustc_infer::infer::{
|
|||
NllRegionVariableOrigin, RelateParamBound,
|
||||
};
|
||||
use rustc_middle::hir::place::PlaceBase;
|
||||
use rustc_middle::mir::{ConstraintCategory, ReturnConstraint};
|
||||
use rustc_middle::mir::{ConstraintCategory, ReturnConstraint, TerminatorKind};
|
||||
use rustc_middle::ty::subst::InternalSubsts;
|
||||
use rustc_middle::ty::Region;
|
||||
use rustc_middle::ty::TypeVisitor;
|
||||
|
@ -39,7 +40,7 @@ use crate::{
|
|||
MirBorrowckCtxt,
|
||||
};
|
||||
|
||||
impl<'tcx> ConstraintDescription for ConstraintCategory<'tcx> {
|
||||
impl ConstraintDescription for ConstraintCategory {
|
||||
fn description(&self) -> &'static str {
|
||||
// Must end with a space. Allows for empty names to be provided.
|
||||
match self {
|
||||
|
@ -115,7 +116,7 @@ pub(crate) enum RegionErrorKind<'tcx> {
|
|||
|
||||
/// Information about the various region constraints involved in a borrow checker error.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ErrorConstraintInfo<'tcx> {
|
||||
pub struct ErrorConstraintInfo {
|
||||
// fr: outlived_fr
|
||||
pub(super) fr: RegionVid,
|
||||
pub(super) fr_is_local: bool,
|
||||
|
@ -123,7 +124,7 @@ pub struct ErrorConstraintInfo<'tcx> {
|
|||
pub(super) outlived_fr_is_local: bool,
|
||||
|
||||
// Category and span for best blame constraint
|
||||
pub(super) category: ConstraintCategory<'tcx>,
|
||||
pub(super) category: ConstraintCategory,
|
||||
pub(super) span: Span,
|
||||
}
|
||||
|
||||
|
@ -498,7 +499,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
/// ```
|
||||
fn report_fnmut_error(
|
||||
&self,
|
||||
errci: &ErrorConstraintInfo<'tcx>,
|
||||
errci: &ErrorConstraintInfo,
|
||||
kind: ReturnConstraint,
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
let ErrorConstraintInfo { outlived_fr, span, .. } = errci;
|
||||
|
@ -571,7 +572,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
#[instrument(level = "debug", skip(self))]
|
||||
fn report_escaping_data_error(
|
||||
&self,
|
||||
errci: &ErrorConstraintInfo<'tcx>,
|
||||
errci: &ErrorConstraintInfo,
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
let ErrorConstraintInfo { span, category, .. } = errci;
|
||||
|
||||
|
@ -675,7 +676,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
/// ```
|
||||
fn report_general_error(
|
||||
&self,
|
||||
errci: &ErrorConstraintInfo<'tcx>,
|
||||
errci: &ErrorConstraintInfo,
|
||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||
let ErrorConstraintInfo {
|
||||
fr,
|
||||
|
@ -788,7 +789,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
diag: &mut Diagnostic,
|
||||
f: Region<'tcx>,
|
||||
o: Region<'tcx>,
|
||||
category: &ConstraintCategory<'tcx>,
|
||||
category: &ConstraintCategory,
|
||||
) {
|
||||
if !o.is_static() {
|
||||
return;
|
||||
|
@ -796,7 +797,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
|
||||
let tcx = self.infcx.tcx;
|
||||
|
||||
let instance = if let ConstraintCategory::CallArgument(Some(func_ty)) = category {
|
||||
let instance =
|
||||
if let ConstraintCategory::CallArgument(location) = category
|
||||
&& let Either::Right(term) = self.body.stmt_at(*location)
|
||||
&& let TerminatorKind::Call { func, .. } = &term.kind
|
||||
{
|
||||
let func_ty = func.ty(self.body, tcx);
|
||||
let (fn_did, substs) = match func_ty.kind() {
|
||||
ty::FnDef(fn_did, substs) => (fn_did, substs),
|
||||
_ => return,
|
||||
|
|
|
@ -91,7 +91,7 @@ pub struct RegionInferenceContext<'tcx> {
|
|||
|
||||
/// Map closure bounds to a `Span` that should be used for error reporting.
|
||||
closure_bounds_mapping:
|
||||
FxHashMap<Location, FxHashMap<(RegionVid, RegionVid), (ConstraintCategory<'tcx>, Span)>>,
|
||||
FxHashMap<Location, FxHashMap<(RegionVid, RegionVid), (ConstraintCategory, Span)>>,
|
||||
|
||||
/// Map universe indexes to information on why we created it.
|
||||
universe_causes: FxHashMap<ty::UniverseIndex, UniverseInfo<'tcx>>,
|
||||
|
@ -267,7 +267,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
member_constraints_in: MemberConstraintSet<'tcx, RegionVid>,
|
||||
closure_bounds_mapping: FxHashMap<
|
||||
Location,
|
||||
FxHashMap<(RegionVid, RegionVid), (ConstraintCategory<'tcx>, Span)>,
|
||||
FxHashMap<(RegionVid, RegionVid), (ConstraintCategory, Span)>,
|
||||
>,
|
||||
universe_causes: FxHashMap<ty::UniverseIndex, UniverseInfo<'tcx>>,
|
||||
type_tests: Vec<TypeTest<'tcx>>,
|
||||
|
@ -1807,7 +1807,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
pub(crate) fn retrieve_closure_constraint_info(
|
||||
&self,
|
||||
constraint: OutlivesConstraint<'tcx>,
|
||||
) -> Option<(ConstraintCategory<'tcx>, Span)> {
|
||||
) -> Option<(ConstraintCategory, Span)> {
|
||||
match constraint.locations {
|
||||
Locations::All(_) => None,
|
||||
Locations::Single(loc) => {
|
||||
|
@ -1822,7 +1822,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
fr1: RegionVid,
|
||||
fr1_origin: NllRegionVariableOrigin,
|
||||
fr2: RegionVid,
|
||||
) -> (ConstraintCategory<'tcx>, ObligationCause<'tcx>) {
|
||||
) -> (ConstraintCategory, ObligationCause<'tcx>) {
|
||||
let BlameConstraint { category, cause, .. } = self
|
||||
.best_blame_constraint(fr1, fr1_origin, |r| self.provides_universal_region(r, fr1, fr2))
|
||||
.0;
|
||||
|
@ -2362,7 +2362,7 @@ impl<'tcx> ClosureRegionRequirementsExt<'tcx> for ClosureRegionRequirements<'tcx
|
|||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BlameConstraint<'tcx> {
|
||||
pub category: ConstraintCategory<'tcx>,
|
||||
pub category: ConstraintCategory,
|
||||
pub from_closure: bool,
|
||||
pub cause: ObligationCause<'tcx>,
|
||||
pub variance_info: ty::VarianceDiagInfo<'tcx>,
|
||||
|
|
|
@ -28,7 +28,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
pub(super) fn fully_perform_op<R: fmt::Debug, Op>(
|
||||
&mut self,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
op: Op,
|
||||
) -> Fallible<R>
|
||||
where
|
||||
|
@ -85,7 +85,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
&mut self,
|
||||
trait_ref: ty::TraitRef<'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) {
|
||||
self.prove_predicate(
|
||||
ty::Binder::dummy(ty::PredicateKind::Trait(ty::TraitPredicate {
|
||||
|
@ -124,7 +124,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
&mut self,
|
||||
predicates: impl IntoIterator<Item = impl ToPredicate<'tcx>>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) {
|
||||
for predicate in predicates {
|
||||
let predicate = predicate.to_predicate(self.tcx());
|
||||
|
@ -139,7 +139,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
&mut self,
|
||||
predicate: ty::Predicate<'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) {
|
||||
let param_env = self.param_env;
|
||||
self.fully_perform_op(
|
||||
|
@ -164,7 +164,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
&mut self,
|
||||
value: T,
|
||||
location: impl NormalizeLocation,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) -> T
|
||||
where
|
||||
T: type_op::normalize::Normalizable<'tcx> + fmt::Display + Copy + 'tcx,
|
||||
|
|
|
@ -37,7 +37,7 @@ pub(crate) struct ConstraintConversion<'a, 'tcx> {
|
|||
param_env: ty::ParamEnv<'tcx>,
|
||||
locations: Locations,
|
||||
span: Span,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
constraints: &'a mut MirTypeckRegionConstraints<'tcx>,
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
|
|||
param_env: ty::ParamEnv<'tcx>,
|
||||
locations: Locations,
|
||||
span: Span,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
constraints: &'a mut MirTypeckRegionConstraints<'tcx>,
|
||||
) -> Self {
|
||||
Self {
|
||||
|
@ -175,7 +175,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
|
|||
&mut self,
|
||||
sup: ty::RegionVid,
|
||||
sub: ty::RegionVid,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) {
|
||||
let category = match self.category {
|
||||
ConstraintCategory::Boring | ConstraintCategory::BoringNoLocation => category,
|
||||
|
@ -203,7 +203,7 @@ impl<'a, 'b, 'tcx> TypeOutlivesDelegate<'tcx> for &'a mut ConstraintConversion<'
|
|||
_origin: SubregionOrigin<'tcx>,
|
||||
a: ty::Region<'tcx>,
|
||||
b: ty::Region<'tcx>,
|
||||
constraint_category: ConstraintCategory<'tcx>,
|
||||
constraint_category: ConstraintCategory,
|
||||
) {
|
||||
let b = self.to_region_vid(b);
|
||||
let a = self.to_region_vid(a);
|
||||
|
|
|
@ -942,7 +942,7 @@ pub(crate) struct MirTypeckRegionConstraints<'tcx> {
|
|||
pub(crate) member_constraints: MemberConstraintSet<'tcx, RegionVid>,
|
||||
|
||||
pub(crate) closure_bounds_mapping:
|
||||
FxHashMap<Location, FxHashMap<(RegionVid, RegionVid), (ConstraintCategory<'tcx>, Span)>>,
|
||||
FxHashMap<Location, FxHashMap<(RegionVid, RegionVid), (ConstraintCategory, Span)>>,
|
||||
|
||||
pub(crate) universe_causes: FxHashMap<ty::UniverseIndex, UniverseInfo<'tcx>>,
|
||||
|
||||
|
@ -1133,7 +1133,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
fn push_region_constraints(
|
||||
&mut self,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
data: &QueryRegionConstraints<'tcx>,
|
||||
) {
|
||||
debug!("constraints generated: {:#?}", data);
|
||||
|
@ -1158,7 +1158,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
sub: Ty<'tcx>,
|
||||
sup: Ty<'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) -> Fallible<()> {
|
||||
// Use this order of parameters because the sup type is usually the
|
||||
// "expected" type in diagnostics.
|
||||
|
@ -1171,7 +1171,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
expected: Ty<'tcx>,
|
||||
found: Ty<'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) -> Fallible<()> {
|
||||
self.relate_types(expected, ty::Variance::Invariant, found, locations, category)
|
||||
}
|
||||
|
@ -1183,7 +1183,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
v: ty::Variance,
|
||||
user_ty: &UserTypeProjection,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) -> Fallible<()> {
|
||||
let annotated_type = self.user_type_annotations[user_ty.base].inferred_ty;
|
||||
let mut curr_projected_ty = PlaceTy::from_ty(annotated_type);
|
||||
|
@ -1618,19 +1618,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
span_mirbug!(self, term, "call to {:?} with wrong # of args", sig);
|
||||
}
|
||||
|
||||
let func_ty = if let TerminatorKind::Call { func, .. } = &term.kind {
|
||||
Some(func.ty(body, self.infcx.tcx))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
debug!(?func_ty);
|
||||
|
||||
for (n, (fn_arg, op_arg)) in iter::zip(sig.inputs(), args).enumerate() {
|
||||
let op_arg_ty = op_arg.ty(body, self.tcx());
|
||||
|
||||
let op_arg_ty = self.normalize(op_arg_ty, term_location);
|
||||
let category = if from_hir_call {
|
||||
ConstraintCategory::CallArgument(func_ty)
|
||||
ConstraintCategory::CallArgument(term_location)
|
||||
} else {
|
||||
ConstraintCategory::Boring
|
||||
};
|
||||
|
|
|
@ -28,7 +28,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
v: ty::Variance,
|
||||
b: Ty<'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) -> Fallible<()> {
|
||||
TypeRelating::new(
|
||||
self.infcx,
|
||||
|
@ -45,7 +45,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||
a: ty::SubstsRef<'tcx>,
|
||||
b: ty::SubstsRef<'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
) -> Fallible<()> {
|
||||
TypeRelating::new(
|
||||
self.infcx,
|
||||
|
@ -64,7 +64,7 @@ struct NllTypeRelatingDelegate<'me, 'bccx, 'tcx> {
|
|||
locations: Locations,
|
||||
|
||||
/// What category do we assign the resulting `'a: 'b` relationships?
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
|
||||
/// Information so that error reporting knows what types we are relating
|
||||
/// when reporting a bound region error.
|
||||
|
@ -75,7 +75,7 @@ impl<'me, 'bccx, 'tcx> NllTypeRelatingDelegate<'me, 'bccx, 'tcx> {
|
|||
fn new(
|
||||
type_checker: &'me mut TypeChecker<'bccx, 'tcx>,
|
||||
locations: Locations,
|
||||
category: ConstraintCategory<'tcx>,
|
||||
category: ConstraintCategory,
|
||||
universe_info: UniverseInfo<'tcx>,
|
||||
) -> Self {
|
||||
Self { type_checker, locations, category, universe_info }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue