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,
op,
is_assign
);
- self.add_type_neq_err_label(
+ involves_fn |= self.add_type_neq_err_label(
&mut err,
rhs_expr.span,
rhs_ty,
"`{}` 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 `{}`",
(lhs_ty, rhs_ty, return_ty)
}
+ /// If one of the types is an uncalled function and calling it would yield the other type,
+ /// suggest calling the function. Returns wether a suggestion was given.
fn add_type_neq_err_label(
&self,
err: &mut errors::DiagnosticBuilder<'_>,
other_ty: Ty<'tcx>,
op: hir::BinOp,
is_assign: IsAssign,
- ) {
+ ) -> bool /* did we suggest to call a function because of missing parenthesis? */ {
err.span_label(span, ty.to_string());
if let FnDef(def_id, _) = ty.sty {
let source_map = self.tcx.sess.source_map();
variable_snippet,
applicability,
);
+ return true;
}
}
+ false
}
fn check_str_addition(
| - ^^ - 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;
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]
}
| |
| 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
| |
| 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
| --- ^ --- 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;