Skip to content

Commit 641ced4

Browse files
committed
Auto merge of #10007 - Jarcho:issue_10005, r=giraffate
Fix ICE in `result_large_err` with uninhabited enums fixes #10005 changelog: `result_large_err`: Fix ICE with uninhabited enums
2 parents ee12b12 + 7ae5c81 commit 641ced4

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

clippy_lints/src/functions/result.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,21 @@ fn check_result_large_err<'tcx>(cx: &LateContext<'tcx>, err_ty: Ty<'tcx>, hir_ty
9494
if let hir::ItemKind::Enum(ref def, _) = item.kind;
9595
then {
9696
let variants_size = AdtVariantInfo::new(cx, *adt, subst);
97-
if variants_size[0].size >= large_err_threshold {
97+
if let Some((first_variant, variants)) = variants_size.split_first()
98+
&& first_variant.size >= large_err_threshold
99+
{
98100
span_lint_and_then(
99101
cx,
100102
RESULT_LARGE_ERR,
101103
hir_ty_span,
102104
"the `Err`-variant returned from this function is very large",
103105
|diag| {
104106
diag.span_label(
105-
def.variants[variants_size[0].ind].span,
107+
def.variants[first_variant.ind].span,
106108
format!("the largest variant contains at least {} bytes", variants_size[0].size),
107109
);
108110

109-
for variant in &variants_size[1..] {
111+
for variant in variants {
110112
if variant.size >= large_err_threshold {
111113
let variant_def = &def.variants[variant.ind];
112114
diag.span_label(

tests/ui/result_large_err.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,10 @@ pub fn array_error<T, U>() -> Result<(), ArrayError<(i32, T), U>> {
108108
Ok(())
109109
}
110110

111+
// Issue #10005
112+
enum Empty {}
113+
fn _empty_error() -> Result<(), Empty> {
114+
Ok(())
115+
}
116+
111117
fn main() {}

0 commit comments

Comments
 (0)