]> git.lizzy.rs Git - rust.git/commitdiff
Fix AnonConst ICE
authorthreadexception <hannes.gaumann@outlook.de>
Sun, 28 Nov 2021 09:20:53 +0000 (10:20 +0100)
committerthreadexception <hannes.gaumann@outlook.de>
Mon, 6 Dec 2021 16:59:37 +0000 (17:59 +0100)
Add test

Apply suggestions

Switch to match

Apply cargofmt

compiler/rustc_typeck/src/collect/type_of.rs
src/test/ui/typeck/issue-91267.rs [new file with mode: 0644]
src/test/ui/typeck/issue-91267.stderr [new file with mode: 0644]

index 04a68250ced0cd0a44387b6fa7d3abf868b03351..b684844744de3c4d49729fb75db2e81ef273d129 100644 (file)
@@ -172,7 +172,7 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
                 // We've encountered an `AnonConst` in some path, so we need to
                 // figure out which generic parameter it corresponds to and return
                 // the relevant type.
-                let (arg_index, segment) = path
+                let filtered = path
                     .segments
                     .iter()
                     .filter_map(|seg| seg.args.map(|args| (args.args, seg)))
@@ -181,10 +181,17 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<
                             .filter(|arg| arg.is_const())
                             .position(|arg| arg.id() == hir_id)
                             .map(|index| (index, seg))
-                    })
-                    .unwrap_or_else(|| {
-                        bug!("no arg matching AnonConst in path");
                     });
+                let (arg_index, segment) = match filtered {
+                    None => {
+                        tcx.sess.delay_span_bug(
+                            tcx.def_span(def_id),
+                            "no arg matching AnonConst in path",
+                        );
+                        return None;
+                    }
+                    Some(inner) => inner,
+                };
 
                 // Try to use the segment resolution if it is valid, otherwise we
                 // default to the path resolution.
diff --git a/src/test/ui/typeck/issue-91267.rs b/src/test/ui/typeck/issue-91267.rs
new file mode 100644 (file)
index 0000000..f5a37e9
--- /dev/null
@@ -0,0 +1,6 @@
+fn main() {
+    0: u8<e<5>=e>
+    //~^ ERROR: cannot find type `e` in this scope [E0412]
+    //~| ERROR: associated type bindings are not allowed here [E0229]
+    //~| ERROR: mismatched types [E0308]
+}
diff --git a/src/test/ui/typeck/issue-91267.stderr b/src/test/ui/typeck/issue-91267.stderr
new file mode 100644 (file)
index 0000000..aac00b9
--- /dev/null
@@ -0,0 +1,27 @@
+error[E0412]: cannot find type `e` in this scope
+  --> $DIR/issue-91267.rs:2:16
+   |
+LL |     0: u8<e<5>=e>
+   |                ^
+   |                |
+   |                not found in this scope
+   |                help: maybe you meant to write an assignment here: `let e`
+
+error[E0229]: associated type bindings are not allowed here
+  --> $DIR/issue-91267.rs:2:11
+   |
+LL |     0: u8<e<5>=e>
+   |           ^^^^^^ associated type not allowed here
+
+error[E0308]: mismatched types
+  --> $DIR/issue-91267.rs:2:5
+   |
+LL | fn main() {
+   |           - expected `()` because of default return type
+LL |     0: u8<e<5>=e>
+   |     ^^^^^^^^^^^^^ expected `()`, found `u8`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0229, E0308, E0412.
+For more information about an error, try `rustc --explain E0229`.