diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index d2fe099e433f2..46c81d34d1b67 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -332,8 +332,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { op.node.as_str(), lhs_ty); + let mut involves_fn = false; if !lhs_expr.span.eq(&rhs_expr.span) { - self.add_type_neq_err_label( + involves_fn |= self.add_type_neq_err_label( &mut err, lhs_expr.span, lhs_ty, @@ -341,7 +342,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { op, is_assign ); - self.add_type_neq_err_label( + involves_fn |= self.add_type_neq_err_label( &mut err, rhs_expr.span, rhs_ty, @@ -410,7 +411,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { "`{}` might need a bound for `{}`", lhs_ty, missing_trait )); - } else if !suggested_deref { + } else if !suggested_deref && !involves_fn { err.note(&format!( "an implementation of `{}` might \ be missing for `{}`", @@ -437,7 +438,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { other_ty: Ty<'tcx>, op: hir::BinOp, is_assign: IsAssign, - ) { + ) -> bool { err.span_label(span, ty.to_string()); if let FnDef(def_id, _) = ty.sty { let source_map = self.tcx.sess.source_map(); @@ -481,8 +482,10 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { variable_snippet, applicability, ); + return true; } } + false } fn check_str_addition( diff --git a/src/test/ui/fn/fn-compare-mismatch.stderr b/src/test/ui/fn/fn-compare-mismatch.stderr index 74fb00f8ac383..c64070a2022d9 100644 --- a/src/test/ui/fn/fn-compare-mismatch.stderr +++ b/src/test/ui/fn/fn-compare-mismatch.stderr @@ -5,8 +5,6 @@ LL | let x = f == g; | - ^^ - fn() {main::g} | | | fn() {main::f} - | - = note: an implementation of `std::cmp::PartialEq` might be missing for `fn() {main::f}` help: you might have forgotten to call this function | LL | let x = f() == g; diff --git a/src/test/ui/issues/issue-59488.rs b/src/test/ui/issues/issue-59488.rs index 27cf16a821ffc..d5fab0a6f9b26 100644 --- a/src/test/ui/issues/issue-59488.rs +++ b/src/test/ui/issues/issue-59488.rs @@ -10,17 +10,17 @@ fn bar(a: i64) -> i64 { fn main() { foo > 12; - //~^ ERROR 12:9: 12:10: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] - //~| ERROR 12:11: 12:13: mismatched types [E0308] + //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] + //~| ERROR mismatched types [E0308] bar > 13; - //~^ ERROR 16:9: 16:10: binary operation `>` cannot be applied to type `fn(i64) -> i64 {bar}` [E0369] - //~| ERROR 16:11: 16:13: mismatched types [E0308] + //~^ ERROR binary operation `>` cannot be applied to type `fn(i64) -> i64 {bar}` [E0369] + //~| ERROR mismatched types [E0308] foo > foo; - //~^ ERROR 20:9: 20:10: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] + //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] foo > bar; - //~^ ERROR 23:9: 23:10: binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] - //~| ERROR 23:11: 23:14: mismatched types [E0308] + //~^ ERROR binary operation `>` cannot be applied to type `fn() -> i32 {foo}` [E0369] + //~| ERROR mismatched types [E0308] } diff --git a/src/test/ui/issues/issue-59488.stderr b/src/test/ui/issues/issue-59488.stderr index b49f5e35f4226..615adb36d330c 100644 --- a/src/test/ui/issues/issue-59488.stderr +++ b/src/test/ui/issues/issue-59488.stderr @@ -6,8 +6,6 @@ LL | foo > 12; | | | fn() -> i32 {foo} | help: you might have forgotten to call this function: `foo()` - | - = note: an implementation of `std::cmp::PartialOrd` might be missing for `fn() -> i32 {foo}` error[E0308]: mismatched types --> $DIR/issue-59488.rs:12:11 @@ -26,8 +24,6 @@ LL | bar > 13; | | | fn(i64) -> i64 {bar} | help: you might have forgotten to call this function: `bar( /* arguments */ )` - | - = note: an implementation of `std::cmp::PartialOrd` might be missing for `fn(i64) -> i64 {bar}` error[E0308]: mismatched types --> $DIR/issue-59488.rs:16:11 @@ -45,8 +41,6 @@ LL | foo > foo; | --- ^ --- fn() -> i32 {foo} | | | fn() -> i32 {foo} - | - = note: an implementation of `std::cmp::PartialOrd` might be missing for `fn() -> i32 {foo}` help: you might have forgotten to call this function | LL | foo() > foo;