store the kind of pattern adjustments in pat_adjustments
This allows us to better distinguish builtin and overloaded implicit dereferences.
This commit is contained in:
parent
0fe8f3454d
commit
f35eae780b
8 changed files with 50 additions and 16 deletions
|
@ -5,7 +5,7 @@ use rustc_errors::MultiSpan;
|
|||
use rustc_hir::{BindingMode, ByRef, HirId, Mutability};
|
||||
use rustc_lint as lint;
|
||||
use rustc_middle::span_bug;
|
||||
use rustc_middle::ty::{self, Rust2024IncompatiblePatInfo, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, Rust2024IncompatiblePatInfo, TyCtxt};
|
||||
use rustc_span::{Ident, Span};
|
||||
|
||||
use crate::errors::{Rust2024IncompatiblePat, Rust2024IncompatiblePatSugg};
|
||||
|
@ -93,10 +93,10 @@ impl<'a> PatMigration<'a> {
|
|||
pub(super) fn visit_implicit_derefs<'tcx>(
|
||||
&mut self,
|
||||
pat_span: Span,
|
||||
adjustments: &[Ty<'tcx>],
|
||||
adjustments: &[ty::adjustment::PatAdjustment<'tcx>],
|
||||
) -> Option<(Span, Mutability)> {
|
||||
let implicit_deref_mutbls = adjustments.iter().map(|ref_ty| {
|
||||
let &ty::Ref(_, _, mutbl) = ref_ty.kind() else {
|
||||
let implicit_deref_mutbls = adjustments.iter().map(|adjust| {
|
||||
let &ty::Ref(_, _, mutbl) = adjust.source.kind() else {
|
||||
span_bug!(pat_span, "pattern implicitly dereferences a non-ref type");
|
||||
};
|
||||
mutbl
|
||||
|
|
|
@ -18,6 +18,7 @@ use rustc_middle::mir::interpret::LitToConstInput;
|
|||
use rustc_middle::thir::{
|
||||
Ascription, FieldPat, LocalVarId, Pat, PatKind, PatRange, PatRangeBoundary,
|
||||
};
|
||||
use rustc_middle::ty::adjustment::PatAdjustment;
|
||||
use rustc_middle::ty::layout::IntegerExt;
|
||||
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, TypingMode};
|
||||
use rustc_middle::{bug, span_bug};
|
||||
|
@ -63,7 +64,7 @@ pub(super) fn pat_from_hir<'a, 'tcx>(
|
|||
|
||||
impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
||||
fn lower_pattern(&mut self, pat: &'tcx hir::Pat<'tcx>) -> Box<Pat<'tcx>> {
|
||||
let adjustments: &[Ty<'tcx>] =
|
||||
let adjustments: &[PatAdjustment<'tcx>] =
|
||||
self.typeck_results.pat_adjustments().get(pat.hir_id).map_or(&[], |v| &**v);
|
||||
|
||||
// Track the default binding mode for the Rust 2024 migration suggestion.
|
||||
|
@ -102,11 +103,11 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
|||
_ => self.lower_pattern_unadjusted(pat),
|
||||
};
|
||||
|
||||
let adjusted_pat = adjustments.iter().rev().fold(unadjusted_pat, |thir_pat, ref_ty| {
|
||||
debug!("{:?}: wrapping pattern with type {:?}", thir_pat, ref_ty);
|
||||
let adjusted_pat = adjustments.iter().rev().fold(unadjusted_pat, |thir_pat, adjust| {
|
||||
debug!("{:?}: wrapping pattern with type {:?}", thir_pat, adjust);
|
||||
Box::new(Pat {
|
||||
span: thir_pat.span,
|
||||
ty: *ref_ty,
|
||||
ty: adjust.source,
|
||||
kind: PatKind::Deref { subpattern: thir_pat },
|
||||
})
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue