Skip to content

Commit

Permalink
Auto merge of #87996 - sexxi-goose:fix-87988, r=nikomatsakis
Browse files Browse the repository at this point in the history
RFC2229 Add missing edge case

Closes #87988

This PR fixes an ICE where a match discriminant is not being read when expected. This ICE was the result of a missing edge case which assumed that if a pattern is of type `PatKind::TupleStruct(..) | PatKind::Path(..) | PatKind::Struct(..) | PatKind::Tuple(..)` then a place could only be a multi variant if the place is of type kind Adt.
  • Loading branch information
bors committed Aug 19, 2021
2 parents 6d64f7f + 2e61659 commit ebedfed
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
3 changes: 3 additions & 0 deletions compiler/rustc_typeck/src/expr_use_visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,9 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
if def.variants.len() > 1 {
needs_to_be_read = true;
}
} else {
// If it is not ty::Adt, then it should be read
needs_to_be_read = true;
}
}
PatKind::Lit(_) | PatKind::Range(..) => {
Expand Down
19 changes: 19 additions & 0 deletions src/test/ui/closures/2229_closure_analysis/issue-87988.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// run-pass
// edition:2021

const LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: i32 = 0x01;
const LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: i32 = 0x02;

pub fn hotplug_callback(event: i32) {
let _ = || {
match event {
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED => (),
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT => (),
_ => (),
};
};
}

fn main() {
hotplug_callback(1);
}
44 changes: 44 additions & 0 deletions src/test/ui/closures/2229_closure_analysis/match-edge-cases.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// run-pass
// edition:2021

const PATTERN_REF: &str = "Hello World";
const NUMBER: i32 = 30;
const NUMBER_POINTER: *const i32 = &NUMBER;

pub fn edge_case_ref(event: &str) {
let _ = || {
match event {
PATTERN_REF => (),
_ => (),
};
};
}

pub fn edge_case_str(event: String) {
let _ = || {
match event.as_str() {
"hello" => (),
_ => (),
};
};
}

pub fn edge_case_raw_ptr(event: *const i32) {
let _ = || {
match event {
NUMBER_POINTER => (),
_ => (),
};
};
}

pub fn edge_case_char(event: char) {
let _ = || {
match event {
'a' => (),
_ => (),
};
};
}

fn main() {}

0 comments on commit ebedfed

Please sign in to comment.