Change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. --<!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --: <!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongBacktrace</strong</summary<p</p</detailsNOTE: The bug is found by our work-in-progress compiler testing tool Kira, and the test program is reduced/minimized by <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
It also fails for every comparison of and
I found another potentially related weirdness: This fails with: But this (without the argument) fails with a different error, even though there should be no difference as is not used: EDIT: Apparently this is intended behavior, see .
searched nightlies: from nightly-2019-01-01 to nightly-2020-10-13 regressed nightly: nightly-2020-05-03 searched commits: from to regressed commit: <details<summarybisected with <a href=''cargo-bisect-rustc</av0.5.2</summaryHost triple: x86_64-apple-darwin Reproduce with: </details
Darn, is it really the bitcode commit again? Or did it happen sometime around then? Cc
This bisection is incorrect due to:
Marking this as P-
claim
You have to write if you want to assign this issue.
Thanks bro. claim

Discussion:
_ => (false, false, false), }; <del> // Type check the descriminant and get its type. </del> <ins> // Type check the discriminant and get its type. </ins> let scrutinee_ty = if force_scrutinee_bool { // Here we want to ensure: //

if !self.tcx.has_typeck_results(def_id) { return false; } <del> // We're emitting a suggestion, so we can just ignore regions let fn_sig = self.tcx.fn_sig(def_id).skip_binder(); </del> <ins> // 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; }; </ins> let other_ty = if let FnDef(def_id, _) = *other_ty.kind() { if !self.tcx.has_typeck_results(def_id) {

<ins> 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` } </ins>

<ins> 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`. </ins>

<ins> fn foo(s: &i32) -> &i32 { let xs; xs } fn main() { let y; if foo == y {} //~^ ERROR binary operation `==` cannot be applied to type } </ins>

<ins> 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`. </ins>