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() {}