Skip to content

Commit

Permalink
Rollup merge of rust-lang#80170 - ldm0:fixice, r=lcnr
Browse files Browse the repository at this point in the history
Fix ICE when lookup method in trait for type that have bound vars

Closes rust-lang#77910
  • Loading branch information
Dylan-DPC authored Dec 21, 2020
2 parents 582ef61 + 00bb293 commit dc977bd
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 3 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_typeck/src/check/_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
//
Expand Down
10 changes: 8 additions & 2 deletions compiler/rustc_typeck/src/check/op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -503,8 +503,14 @@ 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
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) {
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/binop/issue-77910-1.rs
Original file line number Diff line number Diff line change
@@ -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`
}
26 changes: 26 additions & 0 deletions src/test/ui/binop/issue-77910-1.stderr
Original file line number Diff line number Diff line change
@@ -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`.
9 changes: 9 additions & 0 deletions src/test/ui/binop/issue-77910-2.rs
Original file line number Diff line number Diff line change
@@ -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
}
11 changes: 11 additions & 0 deletions src/test/ui/binop/issue-77910-2.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit dc977bd

Please sign in to comment.