about summary refs log tree commit diff
path: root/compiler/rustc_hir_analysis/src/errors
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-07-19 19:48:21 +0000
committerLeón Orell Valerian Liehr <me@fmease.dev>2024-09-18 19:21:07 +0200
commitbd8e88fd7b2401242cbcc95d88ef7b8058d59a77 (patch)
treeaee953e5b4763f2a97bbe4943dbc13fa81090676 /compiler/rustc_hir_analysis/src/errors
parentaaed38b2a631dfc593454abf471d75d84033773e (diff)
downloadrust-bd8e88fd7b2401242cbcc95d88ef7b8058d59a77.tar.gz
rust-bd8e88fd7b2401242cbcc95d88ef7b8058d59a77.zip
Do not ICE with incorrect empty suggestion
When we have two types with the same name, one without type parameters and the other with type parameters and a derive macro, we were before incorrectly suggesting to remove type parameters from the former, which ICEd because we were suggesting to remove nothing. We now gate against this.

The output is still not perfect. E0107 should explicitly detect this case and provide better context, but for now let's avoid the ICE.
Diffstat (limited to 'compiler/rustc_hir_analysis/src/errors')
-rw-r--r--compiler/rustc_hir_analysis/src/errors/wrong_number_of_generic_args.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/compiler/rustc_hir_analysis/src/errors/wrong_number_of_generic_args.rs b/compiler/rustc_hir_analysis/src/errors/wrong_number_of_generic_args.rs
index 97402dd1109..418f12b7158 100644
--- a/compiler/rustc_hir_analysis/src/errors/wrong_number_of_generic_args.rs
+++ b/compiler/rustc_hir_analysis/src/errors/wrong_number_of_generic_args.rs
@@ -1048,7 +1048,17 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> {
                 },
             );
 
-            err.span_suggestion(span, msg, "", Applicability::MaybeIncorrect);
+            if span.is_empty() {
+                // Avoid ICE when types with the same name with `derive`s are in the same scope:
+                // struct NotSM;
+                // #[derive(PartialEq, Eq)]
+                // struct NotSM<T>(T);
+                // With the above code, the suggestion is to remove the generics of the first
+                // `NotSM`, which doesn't *have* generics, so we're suggesting to remove no code
+                // with no code, which ICEs on nightly due to an `assert!`.
+            } else {
+                err.span_suggestion(span, msg, "", Applicability::MaybeIncorrect);
+            }
         } else if redundant_lifetime_args && redundant_type_or_const_args {
             remove_lifetime_args(err);
             remove_type_or_const_args(err);