mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Rollup merge of #101146 - jackh726:borrowck-logging, r=compiler-errors
Various changes to logging of borrowck-related code Cleanups found when doing other changes r? `@compiler-errors`
This commit is contained in:
commit
7b84298f1b
@ -105,8 +105,8 @@ impl<'tcx> fmt::Debug for OutlivesConstraint<'tcx> {
|
||||
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(
|
||||
formatter,
|
||||
"({:?}: {:?}) due to {:?} ({:?})",
|
||||
self.sup, self.sub, self.locations, self.variance_info
|
||||
"({:?}: {:?}) due to {:?} ({:?}) ({:?})",
|
||||
self.sup, self.sub, self.locations, self.variance_info, self.category,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -1119,6 +1119,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
/// short a lifetime. (But sometimes it is more useful to report
|
||||
/// it as a more direct conflict between the execution of a
|
||||
/// `Drop::drop` with an aliasing borrow.)
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
pub(crate) fn report_borrowed_value_does_not_live_long_enough(
|
||||
&mut self,
|
||||
location: Location,
|
||||
@ -1126,13 +1127,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
place_span: (Place<'tcx>, Span),
|
||||
kind: Option<WriteKind>,
|
||||
) {
|
||||
debug!(
|
||||
"report_borrowed_value_does_not_live_long_enough(\
|
||||
{:?}, {:?}, {:?}, {:?}\
|
||||
)",
|
||||
location, borrow, place_span, kind
|
||||
);
|
||||
|
||||
let drop_span = place_span.1;
|
||||
let root_place =
|
||||
self.prefixes(borrow.borrowed_place.as_ref(), PrefixSet::All).last().unwrap();
|
||||
@ -1189,10 +1183,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
let kind_place = kind.filter(|_| place_desc.is_some()).map(|k| (k, place_span.0));
|
||||
let explanation = self.explain_why_borrow_contains_point(location, &borrow, kind_place);
|
||||
|
||||
debug!(
|
||||
"report_borrowed_value_does_not_live_long_enough(place_desc: {:?}, explanation: {:?})",
|
||||
place_desc, explanation
|
||||
);
|
||||
debug!(?place_desc, ?explanation);
|
||||
|
||||
let err = match (place_desc, explanation) {
|
||||
// If the outlives constraint comes from inside the closure,
|
||||
// for example:
|
||||
@ -1464,6 +1456,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
err
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
fn report_temporary_value_does_not_live_long_enough(
|
||||
&mut self,
|
||||
location: Location,
|
||||
@ -1473,13 +1466,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
proper_span: Span,
|
||||
explanation: BorrowExplanation<'tcx>,
|
||||
) -> DiagnosticBuilder<'cx, ErrorGuaranteed> {
|
||||
debug!(
|
||||
"report_temporary_value_does_not_live_long_enough(\
|
||||
{:?}, {:?}, {:?}, {:?}\
|
||||
)",
|
||||
location, borrow, drop_span, proper_span
|
||||
);
|
||||
|
||||
if let BorrowExplanation::MustBeValidFor { category, span, from_closure: false, .. } =
|
||||
explanation
|
||||
{
|
||||
|
@ -336,26 +336,22 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
/// - second half is the place being accessed
|
||||
///
|
||||
/// [d]: https://rust-lang.github.io/rfcs/2094-nll.html#leveraging-intuition-framing-errors-in-terms-of-points
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
pub(crate) fn explain_why_borrow_contains_point(
|
||||
&self,
|
||||
location: Location,
|
||||
borrow: &BorrowData<'tcx>,
|
||||
kind_place: Option<(WriteKind, Place<'tcx>)>,
|
||||
) -> BorrowExplanation<'tcx> {
|
||||
debug!(
|
||||
"explain_why_borrow_contains_point(location={:?}, borrow={:?}, kind_place={:?})",
|
||||
location, borrow, kind_place
|
||||
);
|
||||
|
||||
let regioncx = &self.regioncx;
|
||||
let body: &Body<'_> = &self.body;
|
||||
let tcx = self.infcx.tcx;
|
||||
|
||||
let borrow_region_vid = borrow.region;
|
||||
debug!("explain_why_borrow_contains_point: borrow_region_vid={:?}", borrow_region_vid);
|
||||
debug!(?borrow_region_vid);
|
||||
|
||||
let region_sub = self.regioncx.find_sub_region_live_at(borrow_region_vid, location);
|
||||
debug!("explain_why_borrow_contains_point: region_sub={:?}", region_sub);
|
||||
debug!(?region_sub);
|
||||
|
||||
match find_use::find(body, regioncx, tcx, region_sub, location) {
|
||||
Some(Cause::LiveVar(local, location)) => {
|
||||
@ -408,17 +404,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
opt_place_desc,
|
||||
}
|
||||
} else {
|
||||
debug!(
|
||||
"explain_why_borrow_contains_point: \
|
||||
Could not generate a region name"
|
||||
);
|
||||
debug!("Could not generate a region name");
|
||||
BorrowExplanation::Unexplained
|
||||
}
|
||||
} else {
|
||||
debug!(
|
||||
"explain_why_borrow_contains_point: \
|
||||
Could not generate an error region vid"
|
||||
);
|
||||
debug!("Could not generate an error region vid");
|
||||
BorrowExplanation::Unexplained
|
||||
}
|
||||
}
|
||||
|
@ -975,6 +975,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self, flow_state))]
|
||||
fn check_access_for_conflict(
|
||||
&mut self,
|
||||
location: Location,
|
||||
@ -983,11 +984,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
rw: ReadOrWrite,
|
||||
flow_state: &Flows<'cx, 'tcx>,
|
||||
) -> bool {
|
||||
debug!(
|
||||
"check_access_for_conflict(location={:?}, place_span={:?}, sd={:?}, rw={:?})",
|
||||
location, place_span, sd, rw,
|
||||
);
|
||||
|
||||
let mut error_reported = false;
|
||||
let tcx = self.infcx.tcx;
|
||||
let body = self.body;
|
||||
@ -1451,13 +1447,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
|
||||
/// Checks whether a borrow of this place is invalidated when the function
|
||||
/// exits
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
fn check_for_invalidation_at_exit(
|
||||
&mut self,
|
||||
location: Location,
|
||||
borrow: &BorrowData<'tcx>,
|
||||
span: Span,
|
||||
) {
|
||||
debug!("check_for_invalidation_at_exit({:?})", borrow);
|
||||
let place = borrow.borrowed_place;
|
||||
let mut root_place = PlaceRef { local: place.local, projection: &[] };
|
||||
|
||||
|
@ -44,6 +44,7 @@ pub(crate) fn places_conflict<'tcx>(
|
||||
/// access depth. The `bias` parameter is used to determine how the unknowable (comparing runtime
|
||||
/// array indices, for example) should be interpreted - this depends on what the caller wants in
|
||||
/// order to make the conservative choice and preserve soundness.
|
||||
#[instrument(level = "debug", skip(tcx, body))]
|
||||
pub(super) fn borrow_conflicts_with_place<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
body: &Body<'tcx>,
|
||||
@ -53,11 +54,6 @@ pub(super) fn borrow_conflicts_with_place<'tcx>(
|
||||
access: AccessDepth,
|
||||
bias: PlaceConflictBias,
|
||||
) -> bool {
|
||||
debug!(
|
||||
"borrow_conflicts_with_place({:?}, {:?}, {:?}, {:?})",
|
||||
borrow_place, access_place, access, bias,
|
||||
);
|
||||
|
||||
// This Local/Local case is handled by the more general code below, but
|
||||
// it's so common that it's a speed win to check for it first.
|
||||
if let Some(l1) = borrow_place.as_local() && let Some(l2) = access_place.as_local() {
|
||||
@ -140,10 +136,9 @@ fn place_components_conflict<'tcx>(
|
||||
for (i, (borrow_c, &access_c)) in
|
||||
iter::zip(borrow_place.projection, access_place.projection).enumerate()
|
||||
{
|
||||
debug!("borrow_conflicts_with_place: borrow_c = {:?}", borrow_c);
|
||||
let borrow_proj_base = &borrow_place.projection[..i];
|
||||
debug!(?borrow_c, ?access_c);
|
||||
|
||||
debug!("borrow_conflicts_with_place: access_c = {:?}", access_c);
|
||||
let borrow_proj_base = &borrow_place.projection[..i];
|
||||
|
||||
// Borrow and access path both have more components.
|
||||
//
|
||||
@ -180,7 +175,7 @@ fn place_components_conflict<'tcx>(
|
||||
// idea, at least for now, so just give up and
|
||||
// report a conflict. This is unsafe code anyway so
|
||||
// the user could always use raw pointers.
|
||||
debug!("borrow_conflicts_with_place: arbitrary -> conflict");
|
||||
debug!("arbitrary -> conflict");
|
||||
return true;
|
||||
}
|
||||
Overlap::EqualOrDisjoint => {
|
||||
@ -189,7 +184,7 @@ fn place_components_conflict<'tcx>(
|
||||
Overlap::Disjoint => {
|
||||
// We have proven the borrow disjoint - further
|
||||
// projections will remain disjoint.
|
||||
debug!("borrow_conflicts_with_place: disjoint");
|
||||
debug!("disjoint");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1167,8 +1167,9 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
/// Therefore, this method should only be used in diagnostic code,
|
||||
/// where displaying *some* named universal region is better than
|
||||
/// falling back to 'static.
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
pub(crate) fn approx_universal_upper_bound(&self, r: RegionVid) -> RegionVid {
|
||||
debug!("approx_universal_upper_bound(r={:?}={})", r, self.region_value_str(r));
|
||||
debug!("{}", self.region_value_str(r));
|
||||
|
||||
// Find the smallest universal region that contains all other
|
||||
// universal regions within `region`.
|
||||
@ -1177,7 +1178,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
let static_r = self.universal_regions.fr_static;
|
||||
for ur in self.scc_values.universal_regions_outlived_by(r_scc) {
|
||||
let new_lub = self.universal_region_relations.postdom_upper_bound(lub, ur);
|
||||
debug!("approx_universal_upper_bound: ur={:?} lub={:?} new_lub={:?}", ur, lub, new_lub);
|
||||
debug!(?ur, ?lub, ?new_lub);
|
||||
// The upper bound of two non-static regions is static: this
|
||||
// means we know nothing about the relationship between these
|
||||
// two regions. Pick a 'better' one to use when constructing
|
||||
@ -1201,7 +1202,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
debug!("approx_universal_upper_bound: r={:?} lub={:?}", r, lub);
|
||||
debug!(?r, ?lub);
|
||||
|
||||
lub
|
||||
}
|
||||
@ -2048,6 +2049,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
/// creating a constraint path that forces `R` to outlive
|
||||
/// `from_region`, and then finding the best choices within that
|
||||
/// path to blame.
|
||||
#[instrument(level = "debug", skip(self, target_test))]
|
||||
pub(crate) fn best_blame_constraint(
|
||||
&self,
|
||||
body: &Body<'tcx>,
|
||||
@ -2055,16 +2057,11 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
from_region_origin: NllRegionVariableOrigin,
|
||||
target_test: impl Fn(RegionVid) -> bool,
|
||||
) -> BlameConstraint<'tcx> {
|
||||
debug!(
|
||||
"best_blame_constraint(from_region={:?}, from_region_origin={:?})",
|
||||
from_region, from_region_origin
|
||||
);
|
||||
|
||||
// Find all paths
|
||||
let (path, target_region) =
|
||||
self.find_constraint_paths_between_regions(from_region, target_test).unwrap();
|
||||
debug!(
|
||||
"best_blame_constraint: path={:#?}",
|
||||
"path={:#?}",
|
||||
path.iter()
|
||||
.map(|c| format!(
|
||||
"{:?} ({:?}: {:?})",
|
||||
@ -2116,7 +2113,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
debug!("best_blame_constraint: categorized_path={:#?}", categorized_path);
|
||||
debug!("categorized_path={:#?}", categorized_path);
|
||||
|
||||
// To find the best span to cite, we first try to look for the
|
||||
// final constraint that is interesting and where the `sup` is
|
||||
@ -2214,10 +2211,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
let best_choice =
|
||||
if blame_source { range.rev().find(find_region) } else { range.find(find_region) };
|
||||
|
||||
debug!(
|
||||
"best_blame_constraint: best_choice={:?} blame_source={}",
|
||||
best_choice, blame_source
|
||||
);
|
||||
debug!(?best_choice, ?blame_source);
|
||||
|
||||
if let Some(i) = best_choice {
|
||||
if let Some(next) = categorized_path.get(i + 1) {
|
||||
@ -2254,7 +2248,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
// appears to be the most interesting point to report to the
|
||||
// user via an even more ad-hoc guess.
|
||||
categorized_path.sort_by(|p0, p1| p0.category.cmp(&p1.category));
|
||||
debug!("best_blame_constraint: sorted_path={:#?}", categorized_path);
|
||||
debug!("sorted_path={:#?}", categorized_path);
|
||||
|
||||
categorized_path.remove(0)
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||
/// **Any `rustc_infer::infer` operations that might generate region
|
||||
/// constraints should occur within this method so that those
|
||||
/// constraints can be properly localized!**
|
||||
#[instrument(skip(self, category, op), level = "trace")]
|
||||
#[instrument(skip(self, op), level = "trace")]
|
||||
pub(super) fn fully_perform_op<R, Op>(
|
||||
&mut self,
|
||||
locations: Locations,
|
||||
|
@ -1043,6 +1043,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||
let CanonicalUserTypeAnnotation { span, ref user_ty, inferred_ty } = *user_annotation;
|
||||
let inferred_ty = self.normalize(inferred_ty, Locations::All(span));
|
||||
let annotation = self.instantiate_canonical_with_fresh_inference_vars(span, user_ty);
|
||||
debug!(?annotation);
|
||||
match annotation {
|
||||
UserType::Ty(mut ty) => {
|
||||
ty = self.normalize(ty, Locations::All(span));
|
||||
|
@ -372,7 +372,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> {
|
||||
debug!(
|
||||
"canonical: region var found with vid {:?}, \
|
||||
opportunistically resolved to {:?}",
|
||||
vid, r
|
||||
vid, resolved_vid
|
||||
);
|
||||
let r = self.tcx.reuse_or_mk_region(r, ty::ReVar(resolved_vid));
|
||||
self.canonicalize_mode.canonicalize_free_region(self, r)
|
||||
|
@ -63,8 +63,8 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
|
||||
Canonical<'tcx, QueryResponse<'tcx, T>>: ArenaAllocatable<'tcx>,
|
||||
{
|
||||
let query_response = self.make_query_response(inference_vars, answer, fulfill_cx)?;
|
||||
debug!("query_response = {:#?}", query_response);
|
||||
let canonical_result = self.canonicalize_response(query_response);
|
||||
|
||||
debug!("canonical_result = {:#?}", canonical_result);
|
||||
|
||||
Ok(self.tcx.arena.alloc(canonical_result))
|
||||
@ -125,6 +125,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
|
||||
debug!("ambig_errors = {:#?}", ambig_errors);
|
||||
|
||||
let region_obligations = self.take_registered_region_obligations();
|
||||
debug!(?region_obligations);
|
||||
let region_constraints = self.with_region_constraints(|region_constraints| {
|
||||
make_query_region_constraints(
|
||||
tcx,
|
||||
@ -132,6 +133,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
|
||||
region_constraints,
|
||||
)
|
||||
});
|
||||
debug!(?region_constraints);
|
||||
|
||||
let certainty =
|
||||
if ambig_errors.is_empty() { Certainty::Proven } else { Certainty::Ambiguous };
|
||||
@ -632,6 +634,8 @@ pub fn make_query_region_constraints<'tcx>(
|
||||
assert!(verifys.is_empty());
|
||||
assert!(givens.is_empty());
|
||||
|
||||
debug!(?constraints);
|
||||
|
||||
let outlives: Vec<_> = constraints
|
||||
.iter()
|
||||
.map(|(k, _)| match *k {
|
||||
|
@ -504,7 +504,7 @@ pub enum FixupError<'tcx> {
|
||||
}
|
||||
|
||||
/// See the `region_obligations` field for more information.
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct RegionObligation<'tcx> {
|
||||
pub sub_region: ty::Region<'tcx>,
|
||||
pub sup_type: Ty<'tcx>,
|
||||
@ -2027,16 +2027,6 @@ impl RegionVariableOrigin {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> fmt::Debug for RegionObligation<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"RegionObligation(sub_region={:?}, sup_type={:?})",
|
||||
self.sub_region, self.sup_type
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/// Replaces substs that reference param or infer variables with suitable
|
||||
/// placeholders. This function is meant to remove these param and infer
|
||||
/// substs when they're not actually needed to evaluate a constant.
|
||||
|
@ -92,6 +92,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
|
||||
sub_region: Region<'tcx>,
|
||||
cause: &ObligationCause<'tcx>,
|
||||
) {
|
||||
debug!(?sup_type, ?sub_region, ?cause);
|
||||
let origin = SubregionOrigin::from_obligation_cause(cause, || {
|
||||
infer::RelateParamBound(
|
||||
cause.span,
|
||||
@ -248,14 +249,13 @@ where
|
||||
/// - `origin`, the reason we need this constraint
|
||||
/// - `ty`, the type `T`
|
||||
/// - `region`, the region `'a`
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
pub fn type_must_outlive(
|
||||
&mut self,
|
||||
origin: infer::SubregionOrigin<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
region: ty::Region<'tcx>,
|
||||
) {
|
||||
debug!("type_must_outlive(ty={:?}, region={:?}, origin={:?})", ty, region, origin);
|
||||
|
||||
assert!(!ty.has_escaping_bound_vars());
|
||||
|
||||
let mut components = smallvec![];
|
||||
|
@ -120,6 +120,7 @@ impl<'me, 'tcx> AscribeUserTypeCx<'me, 'tcx> {
|
||||
EarlyBinder(value).subst(self.tcx(), substs)
|
||||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
fn relate_mir_and_user_ty(
|
||||
&mut self,
|
||||
mir_ty: Ty<'tcx>,
|
||||
@ -132,8 +133,8 @@ impl<'me, 'tcx> AscribeUserTypeCx<'me, 'tcx> {
|
||||
|
||||
let ty = tcx.type_of(def_id);
|
||||
let ty = self.subst(ty, substs);
|
||||
debug!("relate_type_and_user_type: ty of def-id is {:?}", ty);
|
||||
let ty = self.normalize(ty);
|
||||
debug!("relate_type_and_user_type: ty of def-id is {:?}", ty);
|
||||
|
||||
self.relate(mir_ty, Variance::Invariant, ty)?;
|
||||
|
||||
@ -144,7 +145,7 @@ impl<'me, 'tcx> AscribeUserTypeCx<'me, 'tcx> {
|
||||
// outlives" error messages.
|
||||
let instantiated_predicates =
|
||||
self.tcx().predicates_of(def_id).instantiate(self.tcx(), substs);
|
||||
debug!(?instantiated_predicates.predicates);
|
||||
debug!(?instantiated_predicates);
|
||||
for instantiated_predicate in instantiated_predicates.predicates {
|
||||
let instantiated_predicate = self.normalize(instantiated_predicate);
|
||||
self.prove_predicate(instantiated_predicate, span);
|
||||
|
Loading…
Reference in New Issue
Block a user