about summary refs log tree commit diff
diff options
context:
space:
mode:
authorflip1995 <philipp.krones@embecosm.com>2021-07-16 10:45:28 +0200
committerflip1995 <philipp.krones@embecosm.com>2021-07-16 10:45:28 +0200
commitb98e2ec527fb13b2eaf4f70fd9c290fd0552e16a (patch)
tree10dce4ca38d9a4109aa5355a236171501e5d55c6
parent78ffcd9959cc81d1328fcafb996dcc7cd9b5f1ac (diff)
downloadrust-b98e2ec527fb13b2eaf4f70fd9c290fd0552e16a.tar.gz
rust-b98e2ec527fb13b2eaf4f70fd9c290fd0552e16a.zip
Fix ICE in redundant_pattern_matching
-rw-r--r--clippy_utils/src/ty.rs6
-rw-r--r--tests/ui/crashes/ice-7410.rs31
2 files changed, 35 insertions, 2 deletions
diff --git a/clippy_utils/src/ty.rs b/clippy_utils/src/ty.rs
index 3f5c5604d43..523d55219ab 100644
--- a/clippy_utils/src/ty.rs
+++ b/clippy_utils/src/ty.rs
@@ -257,10 +257,12 @@ pub fn is_type_diagnostic_item(cx: &LateContext<'_>, ty: Ty<'_>, diag_item: Symb
     }
 }
 
-/// Checks if the type is equal to a lang item
+/// Checks if the type is equal to a lang item.
+///
+/// Returns `false` if the `LangItem` is not defined.
 pub fn is_type_lang_item(cx: &LateContext<'_>, ty: Ty<'_>, lang_item: hir::LangItem) -> bool {
     match ty.kind() {
-        ty::Adt(adt, _) => cx.tcx.lang_items().require(lang_item).unwrap() == adt.did,
+        ty::Adt(adt, _) => cx.tcx.lang_items().require(lang_item).map_or(false, |li| li == adt.did),
         _ => false,
     }
 }
diff --git a/tests/ui/crashes/ice-7410.rs b/tests/ui/crashes/ice-7410.rs
new file mode 100644
index 00000000000..aaa422d88c3
--- /dev/null
+++ b/tests/ui/crashes/ice-7410.rs
@@ -0,0 +1,31 @@
+// compile-flags: -Clink-arg=-nostartfiles
+// ignore-macos
+// ignore-windows
+
+#![feature(lang_items, start, libc)]
+#![no_std]
+#![allow(clippy::redundant_pattern_matching)]
+
+use core::panic::PanicInfo;
+
+struct S;
+
+impl Drop for S {
+    fn drop(&mut self) {}
+}
+
+#[start]
+fn main(argc: isize, argv: *const *const u8) -> isize {
+    if let Some(_) = Some(S) {
+    } else {
+    }
+    0
+}
+
+#[panic_handler]
+fn panic(_info: &PanicInfo) -> ! {
+    loop {}
+}
+
+#[lang = "eh_personality"]
+extern "C" fn eh_personality() {}