Skip to content

Commit

Permalink
rustc_hir_typeck: Account for skipped_ref_pats in expr_use_visitor
Browse files Browse the repository at this point in the history
Fixes #125058
  • Loading branch information
Jules-Bertholet committed May 13, 2024
1 parent 421f7ca commit fe8f66e
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
12 changes: 11 additions & 1 deletion compiler/rustc_hir_typeck/src/expr_use_visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ use rustc_hir as hir;
use rustc_hir::def::{CtorOf, Res};
use rustc_hir::def_id::LocalDefId;
use rustc_hir::{HirId, PatKind};
use rustc_middle::{bug, span_bug};
use rustc_middle::hir::place::ProjectionKind;
use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::{
self, adjustment, AdtKind, Ty, TyCtxt, TypeFoldable, TypeVisitableExt as _,
};
use rustc_middle::{bug, span_bug};
use rustc_span::{ErrorGuaranteed, Span};
use rustc_target::abi::{FieldIdx, VariantIdx, FIRST_VARIANT};
use rustc_trait_selection::infer::InferCtxtExt;
Expand Down Expand Up @@ -1181,6 +1181,10 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
debug!("pat_ty(pat={:?}) found adjusted ty `{:?}`", pat, first_ty);
return Ok(*first_ty);
}
} else if let PatKind::Ref(subpat, _) = pat.kind
&& self.cx.typeck_results().skipped_ref_pats().contains(pat.hir_id)
{
return self.pat_ty_adjusted(subpat);
}

self.pat_ty_unadjusted(pat)
Expand Down Expand Up @@ -1712,6 +1716,12 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
self.cat_pattern(place_with_id, subpat, op)?;
}

PatKind::Ref(subpat, _)
if self.cx.typeck_results().skipped_ref_pats().contains(pat.hir_id) =>
{
self.cat_pattern(place_with_id, subpat, op)?;
}

PatKind::Box(subpat) | PatKind::Ref(subpat, _) => {
// box p1, &p1, &mut p1. we can ignore the mutability of
// PatKind::Ref since that information is already contained
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/pattern/skipped-ref-pats-issue-125058.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//@ run-pass
//@ edition: 2024
//@ compile-flags: -Zunstable-options

#![allow(incomplete_features)]
#![feature(ref_pat_eat_one_layer_2024)]

struct Foo;
//~^ WARN struct `Foo` is never constructed

fn main() {
|| {
//~^ WARN unused closure that must be used
if let Some(Some(&mut x)) = &mut Some(&mut Some(0)) {
let _: u32 = x;
}
};
}
24 changes: 24 additions & 0 deletions tests/ui/pattern/skipped-ref-pats-issue-125058.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
warning: struct `Foo` is never constructed
--> $DIR/skipped-ref-pats-issue-125058.rs:8:8
|
LL | struct Foo;
| ^^^
|
= note: `#[warn(dead_code)]` on by default

warning: unused closure that must be used
--> $DIR/skipped-ref-pats-issue-125058.rs:12:5
|
LL | / || {
LL | |
LL | | if let Some(Some(&mut x)) = &mut Some(&mut Some(0)) {
LL | | let _: u32 = x;
LL | | }
LL | | };
| |_____^
|
= note: closures are lazy and do nothing unless called
= note: `#[warn(unused_must_use)]` on by default

warning: 2 warnings emitted

0 comments on commit fe8f66e

Please sign in to comment.