Replace try_upvars_resolved with try_to_place
This commit is contained in:
parent
1c819792a7
commit
be5b7778c8
@ -267,14 +267,13 @@ fn expect_upvars_resolved(self, cx: &Builder<'_, 'tcx>) -> PlaceBuilder<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub(in crate::build) fn try_upvars_resolved(
|
||||
self,
|
||||
cx: &Builder<'_, 'tcx>,
|
||||
) -> Result<PlaceBuilder<'tcx>, PlaceBuilder<'tcx>> {
|
||||
match self.base {
|
||||
PlaceBase::Local(_) => Ok(self),
|
||||
PlaceBase::Upvar { .. } => self.resolve_upvar(cx).ok_or(self),
|
||||
}
|
||||
/// Creates a `Place` or returns `None` if an upvar cannot be resolved
|
||||
pub(in crate::build) fn try_to_place(&self, cx: &Builder<'_, 'tcx>) -> Option<Place<'tcx>> {
|
||||
let resolved = self.resolve_upvar(cx);
|
||||
let builder = resolved.as_ref().unwrap_or(self);
|
||||
let PlaceBase::Local(local) = builder.base else { return None };
|
||||
let projection = cx.tcx.intern_place_elems(&builder.projection);
|
||||
Some(Place { local, projection })
|
||||
}
|
||||
|
||||
/// Attempts to resolve the `PlaceBuilder`.
|
||||
|
@ -369,8 +369,7 @@ pub(crate) fn as_rvalue(
|
||||
let place_builder =
|
||||
unpack!(block = this.as_place_builder(block, &this.thir[*thir_place]));
|
||||
|
||||
if let Ok(place_builder_resolved) = place_builder.try_upvars_resolved(this) {
|
||||
let mir_place = place_builder_resolved.into_place(this);
|
||||
if let Some(mir_place) = place_builder.try_to_place(this) {
|
||||
this.cfg.push_fake_read(
|
||||
block,
|
||||
this.source_info(this.tcx.hir().span(*hir_id)),
|
||||
|
@ -220,8 +220,7 @@ fn lower_scrutinee(
|
||||
let cause_matched_place = FakeReadCause::ForMatchedPlace(None);
|
||||
let source_info = self.source_info(scrutinee_span);
|
||||
|
||||
if let Ok(scrutinee_builder) = scrutinee_place_builder.clone().try_upvars_resolved(self) {
|
||||
let scrutinee_place = scrutinee_builder.into_place(self);
|
||||
if let Some(scrutinee_place) = scrutinee_place_builder.try_to_place(self) {
|
||||
self.cfg.push_fake_read(block, source_info, cause_matched_place, scrutinee_place);
|
||||
}
|
||||
|
||||
@ -334,7 +333,7 @@ fn lower_match_arms(
|
||||
let arm_scope = (arm.scope, arm_source_info);
|
||||
let match_scope = self.local_scope();
|
||||
self.in_scope(arm_scope, arm.lint_level, |this| {
|
||||
// `try_upvars_resolved` may fail if it is unable to resolve the given
|
||||
// `try_to_place` may fail if it is unable to resolve the given
|
||||
// `PlaceBuilder` inside a closure. In this case, we don't want to include
|
||||
// a scrutinee place. `scrutinee_place_builder` will fail to be resolved
|
||||
// if the only match arm is a wildcard (`_`).
|
||||
@ -345,14 +344,9 @@ fn lower_match_arms(
|
||||
// match foo { _ => () };
|
||||
// };
|
||||
// ```
|
||||
let mut opt_scrutinee_place: Option<(Option<&Place<'tcx>>, Span)> = None;
|
||||
let scrutinee_place: Place<'tcx>;
|
||||
if let Ok(scrutinee_builder) =
|
||||
scrutinee_place_builder.clone().try_upvars_resolved(this)
|
||||
{
|
||||
scrutinee_place = scrutinee_builder.into_place(this);
|
||||
opt_scrutinee_place = Some((Some(&scrutinee_place), scrutinee_span));
|
||||
}
|
||||
let scrutinee_place = scrutinee_place_builder.try_to_place(this);
|
||||
let opt_scrutinee_place =
|
||||
scrutinee_place.as_ref().map(|place| (Some(place), scrutinee_span));
|
||||
let scope = this.declare_bindings(
|
||||
None,
|
||||
arm.span,
|
||||
@ -591,7 +585,7 @@ pub(crate) fn place_into_pattern(
|
||||
while let Some(next) = {
|
||||
for binding in &candidate_ref.bindings {
|
||||
let local = self.var_local_id(binding.var_id, OutsideGuard);
|
||||
// `try_upvars_resolved` may fail if it is unable to resolve the given
|
||||
// `try_to_place` may fail if it is unable to resolve the given
|
||||
// `PlaceBuilder` inside a closure. In this case, we don't want to include
|
||||
// a scrutinee place. `scrutinee_place_builder` will fail for destructured
|
||||
// assignments. This is because a closure only captures the precise places
|
||||
@ -605,9 +599,7 @@ pub(crate) fn place_into_pattern(
|
||||
// let (v1, v2) = foo;
|
||||
// };
|
||||
// ```
|
||||
if let Ok(match_pair_resolved) = initializer.clone().try_upvars_resolved(self) {
|
||||
let place = match_pair_resolved.into_place(self);
|
||||
|
||||
if let Some(place) = initializer.try_to_place(self) {
|
||||
let Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
|
||||
VarBindingForm { opt_match_place: Some((ref mut match_place, _)), .. },
|
||||
)))) = self.local_decls[local].local_info else {
|
||||
@ -1594,10 +1586,9 @@ fn test_candidates<'pat, 'b, 'c>(
|
||||
}
|
||||
|
||||
// Insert a Shallow borrow of any places that is switched on.
|
||||
if let Some(fb) = fake_borrows && let Ok(match_place_resolved) =
|
||||
match_place.clone().try_upvars_resolved(self)
|
||||
if let Some(fb) = fake_borrows
|
||||
&& let Some(resolved_place) = match_place.try_to_place(self)
|
||||
{
|
||||
let resolved_place = match_place_resolved.into_place(self);
|
||||
fb.insert(resolved_place);
|
||||
}
|
||||
|
||||
@ -1788,12 +1779,8 @@ pub(crate) fn lower_let_expr(
|
||||
false,
|
||||
&mut [&mut guard_candidate, &mut otherwise_candidate],
|
||||
);
|
||||
let mut opt_expr_place: Option<(Option<&Place<'tcx>>, Span)> = None;
|
||||
let expr_place: Place<'tcx>;
|
||||
if let Ok(expr_builder) = expr_place_builder.try_upvars_resolved(self) {
|
||||
expr_place = expr_builder.into_place(self);
|
||||
opt_expr_place = Some((Some(&expr_place), expr_span));
|
||||
}
|
||||
let expr_place = expr_place_builder.try_to_place(self);
|
||||
let opt_expr_place = expr_place.as_ref().map(|place| (Some(place), expr_span));
|
||||
let otherwise_post_guard_block = otherwise_candidate.pre_binding_block.unwrap();
|
||||
self.break_for_else(otherwise_post_guard_block, else_target, self.source_info(expr_span));
|
||||
|
||||
|
@ -156,10 +156,10 @@ fn simplify_match_pair<'pat>(
|
||||
ascription: thir::Ascription { ref annotation, variance },
|
||||
} => {
|
||||
// Apply the type ascription to the value at `match_pair.place`, which is the
|
||||
if let Ok(place_resolved) = match_pair.place.clone().try_upvars_resolved(self) {
|
||||
if let Some(source) = match_pair.place.try_to_place(self) {
|
||||
candidate.ascriptions.push(Ascription {
|
||||
annotation: annotation.clone(),
|
||||
source: place_resolved.into_place(self),
|
||||
source,
|
||||
variance,
|
||||
});
|
||||
}
|
||||
@ -183,10 +183,10 @@ fn simplify_match_pair<'pat>(
|
||||
ref subpattern,
|
||||
is_primary: _,
|
||||
} => {
|
||||
if let Ok(place_resolved) = match_pair.place.clone().try_upvars_resolved(self) {
|
||||
if let Some(source) = match_pair.place.try_to_place(self) {
|
||||
candidate.bindings.push(Binding {
|
||||
span: match_pair.pattern.span,
|
||||
source: place_resolved.into_place(self),
|
||||
source,
|
||||
var_id: var,
|
||||
binding_mode: mode,
|
||||
});
|
||||
|
@ -33,15 +33,14 @@ pub(crate) fn prefix_slice_suffix<'pat>(
|
||||
suffix: &'pat [Box<Pat<'tcx>>],
|
||||
) {
|
||||
let tcx = self.tcx;
|
||||
let (min_length, exact_size) =
|
||||
if let Ok(place_resolved) = place.clone().try_upvars_resolved(self) {
|
||||
match place_resolved.into_place(self).ty(&self.local_decls, tcx).ty.kind() {
|
||||
ty::Array(_, length) => (length.eval_usize(tcx, self.param_env), true),
|
||||
_ => ((prefix.len() + suffix.len()).try_into().unwrap(), false),
|
||||
}
|
||||
} else {
|
||||
((prefix.len() + suffix.len()).try_into().unwrap(), false)
|
||||
};
|
||||
let (min_length, exact_size) = if let Some(place_resolved) = place.try_to_place(self) {
|
||||
match place_resolved.ty(&self.local_decls, tcx).ty.kind() {
|
||||
ty::Array(_, length) => (length.eval_usize(tcx, self.param_env), true),
|
||||
_ => ((prefix.len() + suffix.len()).try_into().unwrap(), false),
|
||||
}
|
||||
} else {
|
||||
((prefix.len() + suffix.len()).try_into().unwrap(), false)
|
||||
};
|
||||
|
||||
match_pairs.extend(prefix.iter().enumerate().map(|(idx, subpattern)| {
|
||||
let elem =
|
||||
@ -97,15 +96,15 @@ pub(crate) fn false_edges(
|
||||
|
||||
impl<'pat, 'tcx> MatchPair<'pat, 'tcx> {
|
||||
pub(in crate::build) fn new(
|
||||
place: PlaceBuilder<'tcx>,
|
||||
mut place: PlaceBuilder<'tcx>,
|
||||
pattern: &'pat Pat<'tcx>,
|
||||
cx: &Builder<'_, 'tcx>,
|
||||
) -> MatchPair<'pat, 'tcx> {
|
||||
// Force the place type to the pattern's type.
|
||||
// FIXME(oli-obk): can we use this to simplify slice/array pattern hacks?
|
||||
let mut place = match place.try_upvars_resolved(cx) {
|
||||
Ok(val) | Err(val) => val,
|
||||
};
|
||||
if let Some(resolved) = place.resolve_upvar(cx) {
|
||||
place = resolved;
|
||||
}
|
||||
|
||||
// Only add the OpaqueCast projection if the given place is an opaque type and the
|
||||
// expected type from the pattern is not.
|
||||
|
Loading…
Reference in New Issue
Block a user