]> git.lizzy.rs Git - rust.git/commitdiff
Fix ICE in `result large_err` with uninhabited enums
authorJason Newcomb <jsnewcomb@pm.me>
Thu, 1 Dec 2022 02:44:18 +0000 (21:44 -0500)
committerJason Newcomb <jsnewcomb@pm.me>
Thu, 1 Dec 2022 02:44:18 +0000 (21:44 -0500)
clippy_lints/src/functions/result.rs
tests/ui/result_large_err.rs

index f7e30b051a694a84d6be001e103f067a804d58b7..23da145d038257be75f38c88c8247ac55aaa169a 100644 (file)
@@ -94,7 +94,9 @@ fn check_result_large_err<'tcx>(cx: &LateContext<'tcx>, err_ty: Ty<'tcx>, hir_ty
         if let hir::ItemKind::Enum(ref def, _) = item.kind;
         then {
             let variants_size = AdtVariantInfo::new(cx, *adt, subst);
-            if variants_size[0].size >= large_err_threshold {
+            if let Some((first_variant, variants)) = variants_size.split_first()
+                && first_variant.size >= large_err_threshold
+            {
                 span_lint_and_then(
                     cx,
                     RESULT_LARGE_ERR,
@@ -102,11 +104,11 @@ fn check_result_large_err<'tcx>(cx: &LateContext<'tcx>, err_ty: Ty<'tcx>, hir_ty
                     "the `Err`-variant returned from this function is very large",
                     |diag| {
                         diag.span_label(
-                            def.variants[variants_size[0].ind].span,
+                            def.variants[first_variant.ind].span,
                             format!("the largest variant contains at least {} bytes", variants_size[0].size),
                         );
 
-                        for variant in &variants_size[1..] {
+                        for variant in variants {
                             if variant.size >= large_err_threshold {
                                 let variant_def = &def.variants[variant.ind];
                                 diag.span_label(
index 9dd27d6dc01aaf8ae40245fc024c49b0e35cea14..1c12cebfd971a372480593586f63c009d5940978 100644 (file)
@@ -108,4 +108,10 @@ pub fn array_error<T, U>() -> Result<(), ArrayError<(i32, T), U>> {
     Ok(())
 }
 
+// Issue #10005
+enum Empty {}
+fn _empty_error() -> Result<(), Empty> {
+    Ok(())
+}
+
 fn main() {}