]> git.lizzy.rs Git - rust.git/commitdiff
Fix ICE on suggesting calling function
authorDonough Liu <ldm2993593805@163.com>
Sun, 20 Dec 2020 08:18:34 +0000 (16:18 +0800)
committerDonough Liu <ldm2993593805@163.com>
Sun, 20 Dec 2020 11:53:22 +0000 (19:53 +0800)
compiler/rustc_typeck/src/check/_match.rs
compiler/rustc_typeck/src/check/op.rs
src/test/compile-fail/issue-77910-1.rs [new file with mode: 0644]
src/test/compile-fail/issue-77910-2.rs [new file with mode: 0644]

index 3106f19cf86f33352145f3e0967f6c5af36009b5..6467e04407939400018df59daecc245cba23084b 100644 (file)
@@ -31,7 +31,7 @@ pub fn check_match(
             _ => (false, false, false),
         };
 
-        // Type check the descriminant and get its type.
+        // Type check the discriminant and get its type.
         let scrutinee_ty = if force_scrutinee_bool {
             // Here we want to ensure:
             //
index 854bc70108f691f11f347e7f4443588963a146aa..6305bafcd94d6d11f6a282f40fefb2ad32e8182b 100644 (file)
@@ -504,7 +504,14 @@ fn add_type_neq_err_label(
                 return false;
             }
             // We're emitting a suggestion, so we can just ignore regions
-            let fn_sig = self.tcx.fn_sig(def_id).skip_binder();
+            // FIXME: Instead of exiting early when encountering bound vars in
+            // the function signature, consider keeping the binder here and
+            // propagating it downwards.
+            let fn_sig = if let Some(fn_sig) = self.tcx.fn_sig(def_id).no_bound_vars() {
+                fn_sig
+            } else {
+                return false;
+            };
 
             let other_ty = if let FnDef(def_id, _) = *other_ty.kind() {
                 if !self.tcx.has_typeck_results(def_id) {
diff --git a/src/test/compile-fail/issue-77910-1.rs b/src/test/compile-fail/issue-77910-1.rs
new file mode 100644 (file)
index 0000000..d786e33
--- /dev/null
@@ -0,0 +1,11 @@
+fn foo(s: &i32) -> &i32 {
+    let xs;
+    xs
+}
+fn main() {
+    let y;
+    // we shouldn't ice with the bound var here.
+    assert_eq!(foo, y);
+    //~^ ERROR binary operation `==` cannot be applied to type
+    //~| ERROR `for<'r> fn(&'r i32) -> &'r i32 {foo}` doesn't implement `Debug`
+}
diff --git a/src/test/compile-fail/issue-77910-2.rs b/src/test/compile-fail/issue-77910-2.rs
new file mode 100644 (file)
index 0000000..2bb48d3
--- /dev/null
@@ -0,0 +1,9 @@
+fn foo(s: &i32) -> &i32 {
+    let xs;
+    xs
+}
+fn main() {
+    let y;
+    if foo == y {}
+    //~^ ERROR binary operation `==` cannot be applied to type
+}