Skip to content

Commit

Permalink
Unrolled build for rust-lang#126295
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#126295 - linyihai:uninitalized-in-match-arm, r=pnkfelix

No uninitalized report in a pre-returned match arm

This is a attemp to address rust-lang#126133
  • Loading branch information
rust-timer authored Jun 12, 2024
2 parents 0285dab + 5d8f40a commit b885fa3
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 4 deletions.
21 changes: 17 additions & 4 deletions compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -557,8 +557,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
// for the branching codepaths that aren't covered, to point at them.
let map = self.infcx.tcx.hir();
let body = map.body_owned_by(self.mir_def_id());

let mut visitor = ConditionVisitor { spans: &spans, name: &name, errors: vec![] };
let mut visitor =
ConditionVisitor { tcx: self.infcx.tcx, spans: &spans, name: &name, errors: vec![] };
visitor.visit_body(&body);

let mut show_assign_sugg = false;
Expand Down Expand Up @@ -4372,13 +4372,14 @@ impl<'hir> Visitor<'hir> for BreakFinder {

/// Given a set of spans representing statements initializing the relevant binding, visit all the
/// function expressions looking for branching code paths that *do not* initialize the binding.
struct ConditionVisitor<'b> {
struct ConditionVisitor<'b, 'tcx> {
tcx: TyCtxt<'tcx>,
spans: &'b [Span],
name: &'b str,
errors: Vec<(Span, String)>,
}

impl<'b, 'v> Visitor<'v> for ConditionVisitor<'b> {
impl<'b, 'v, 'tcx> Visitor<'v> for ConditionVisitor<'b, 'tcx> {
fn visit_expr(&mut self, ex: &'v hir::Expr<'v>) {
match ex.kind {
hir::ExprKind::If(cond, body, None) => {
Expand Down Expand Up @@ -4464,6 +4465,12 @@ impl<'b, 'v> Visitor<'v> for ConditionVisitor<'b> {
),
));
} else if let Some(guard) = &arm.guard {
if matches!(
self.tcx.hir_node(arm.body.hir_id),
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Ret(_), .. })
) {
continue;
}
self.errors.push((
arm.pat.span.to(guard.span),
format!(
Expand All @@ -4473,6 +4480,12 @@ impl<'b, 'v> Visitor<'v> for ConditionVisitor<'b> {
),
));
} else {
if matches!(
self.tcx.hir_node(arm.body.hir_id),
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Ret(_), .. })
) {
continue;
}
self.errors.push((
arm.pat.span,
format!(
Expand Down
22 changes: 22 additions & 0 deletions tests/ui/borrowck/uninitalized-in-match-arm-issue-126133.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
enum E {
A,
B,
C,
}

fn foo(e: E) {
let bar;

match e {
E::A if true => return,
E::A => return,
E::B => {}
E::C => {
bar = 5;
}
}

let _baz = bar; //~ ERROR E0381
}

fn main() {}
15 changes: 15 additions & 0 deletions tests/ui/borrowck/uninitalized-in-match-arm-issue-126133.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
error[E0381]: used binding `bar` is possibly-uninitialized
--> $DIR/uninitalized-in-match-arm-issue-126133.rs:19:16
|
LL | let bar;
| --- binding declared here but left uninitialized
...
LL | E::B => {}
| ---- if this pattern is matched, `bar` is not initialized
...
LL | let _baz = bar;
| ^^^ `bar` used here but it is possibly-uninitialized

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0381`.

0 comments on commit b885fa3

Please sign in to comment.