From a33f6ac9a0b124f3373cd0fd2063bfadf4242e5d Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Sun, 20 Dec 2020 16:18:34 +0800 Subject: [PATCH 1/3] Fix ICE on suggesting calling function --- compiler/rustc_typeck/src/check/_match.rs | 2 +- compiler/rustc_typeck/src/check/op.rs | 9 ++++++++- src/test/compile-fail/issue-77910-1.rs | 11 +++++++++++ src/test/compile-fail/issue-77910-2.rs | 9 +++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/test/compile-fail/issue-77910-1.rs create mode 100644 src/test/compile-fail/issue-77910-2.rs diff --git a/compiler/rustc_typeck/src/check/_match.rs b/compiler/rustc_typeck/src/check/_match.rs index 3106f19cf86f3..6467e04407939 100644 --- a/compiler/rustc_typeck/src/check/_match.rs +++ b/compiler/rustc_typeck/src/check/_match.rs @@ -31,7 +31,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { _ => (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: // diff --git a/compiler/rustc_typeck/src/check/op.rs b/compiler/rustc_typeck/src/check/op.rs index 854bc70108f69..6305bafcd94d6 100644 --- a/compiler/rustc_typeck/src/check/op.rs +++ b/compiler/rustc_typeck/src/check/op.rs @@ -504,7 +504,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { 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 index 0000000000000..d786e33585984 --- /dev/null +++ b/src/test/compile-fail/issue-77910-1.rs @@ -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 index 0000000000000..2bb48d3657617 --- /dev/null +++ b/src/test/compile-fail/issue-77910-2.rs @@ -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 +} From 4eb28c358c189c9fa35cc4ed22c2c0d230fbe9b2 Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Sun, 20 Dec 2020 21:45:23 +0800 Subject: [PATCH 2/3] Update compiler/rustc_typeck/src/check/op.rs Co-authored-by: lcnr --- compiler/rustc_typeck/src/check/op.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/rustc_typeck/src/check/op.rs b/compiler/rustc_typeck/src/check/op.rs index 6305bafcd94d6..9ab056c0d74b3 100644 --- a/compiler/rustc_typeck/src/check/op.rs +++ b/compiler/rustc_typeck/src/check/op.rs @@ -503,7 +503,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if !self.tcx.has_typeck_results(def_id) { return false; } - // We're emitting a suggestion, so we can just ignore regions // FIXME: Instead of exiting early when encountering bound vars in // the function signature, consider keeping the binder here and // propagating it downwards. From 00bb2935fcfb54dcd2b770ff451bd0a4c97738a0 Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Sun, 20 Dec 2020 23:39:25 +0800 Subject: [PATCH 3/3] Move test from compile-fail to ui/binop --- .../binop}/issue-77910-1.rs | 0 src/test/ui/binop/issue-77910-1.stderr | 26 +++++++++++++++++++ .../binop}/issue-77910-2.rs | 0 src/test/ui/binop/issue-77910-2.stderr | 11 ++++++++ 4 files changed, 37 insertions(+) rename src/test/{compile-fail => ui/binop}/issue-77910-1.rs (100%) create mode 100644 src/test/ui/binop/issue-77910-1.stderr rename src/test/{compile-fail => ui/binop}/issue-77910-2.rs (100%) create mode 100644 src/test/ui/binop/issue-77910-2.stderr diff --git a/src/test/compile-fail/issue-77910-1.rs b/src/test/ui/binop/issue-77910-1.rs similarity index 100% rename from src/test/compile-fail/issue-77910-1.rs rename to src/test/ui/binop/issue-77910-1.rs diff --git a/src/test/ui/binop/issue-77910-1.stderr b/src/test/ui/binop/issue-77910-1.stderr new file mode 100644 index 0000000000000..e48d3e19996f3 --- /dev/null +++ b/src/test/ui/binop/issue-77910-1.stderr @@ -0,0 +1,26 @@ +error[E0369]: binary operation `==` cannot be applied to type `for<'r> fn(&'r i32) -> &'r i32 {foo}` + --> $DIR/issue-77910-1.rs:8:5 + | +LL | assert_eq!(foo, y); + | ^^^^^^^^^^^^^^^^^^^ + | | + | for<'r> fn(&'r i32) -> &'r i32 {foo} + | _ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0277]: `for<'r> fn(&'r i32) -> &'r i32 {foo}` doesn't implement `Debug` + --> $DIR/issue-77910-1.rs:8:5 + | +LL | assert_eq!(foo, y); + | ^^^^^^^^^^^^^^^^^^^ `for<'r> fn(&'r i32) -> &'r i32 {foo}` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = help: the trait `Debug` is not implemented for `for<'r> fn(&'r i32) -> &'r i32 {foo}` + = note: required because of the requirements on the impl of `Debug` for `&for<'r> fn(&'r i32) -> &'r i32 {foo}` + = note: required by `std::fmt::Debug::fmt` + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0277, E0369. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/compile-fail/issue-77910-2.rs b/src/test/ui/binop/issue-77910-2.rs similarity index 100% rename from src/test/compile-fail/issue-77910-2.rs rename to src/test/ui/binop/issue-77910-2.rs diff --git a/src/test/ui/binop/issue-77910-2.stderr b/src/test/ui/binop/issue-77910-2.stderr new file mode 100644 index 0000000000000..5477a5762a8fd --- /dev/null +++ b/src/test/ui/binop/issue-77910-2.stderr @@ -0,0 +1,11 @@ +error[E0369]: binary operation `==` cannot be applied to type `for<'r> fn(&'r i32) -> &'r i32 {foo}` + --> $DIR/issue-77910-2.rs:7:12 + | +LL | if foo == y {} + | --- ^^ - _ + | | + | for<'r> fn(&'r i32) -> &'r i32 {foo} + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0369`.