in which suggestions to borrow casts or binary expressions are rectified

This simple patch resolves #46756 (which was specifically about the case of
casts, but it would be poor form indeed to fix a reported issue without at
least a cursory attempt at answering the immortal question, "How does this bug
generalize?").
This commit is contained in:
Zack M. Davis 2017-12-15 23:26:00 -08:00
parent b3392f8ae4
commit 73a90194f9
3 changed files with 56 additions and 2 deletions

View file

@ -260,12 +260,16 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
// Use the callsite's span if this is a macro call. #41858
let sp = self.sess().codemap().call_span_if_macro(expr.span);
if let Ok(src) = self.tcx.sess.codemap().span_to_snippet(sp) {
let sugg_expr = match expr.node { // parenthesize if needed (Issue #46756)
hir::ExprCast(_, _) | hir::ExprBinary(_, _, _) => format!("({})", src),
_ => src,
};
return Some(match mutability.mutbl {
hir::Mutability::MutMutable => {
("consider mutably borrowing here", format!("&mut {}", src))
("consider mutably borrowing here", format!("&mut {}", sugg_expr))
}
hir::Mutability::MutImmutable => {
("consider borrowing here", format!("&{}", src))
("consider borrowing here", format!("&{}", sugg_expr))
}
});
}

View file

@ -0,0 +1,24 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![allow(unused)]
fn light_flows_our_war_of_mocking_words(and_yet: &usize) -> usize {
and_yet + 1
}
fn main() {
let behold: isize = 2;
let with_tears: usize = 3;
light_flows_our_war_of_mocking_words(behold as usize);
//~^ ERROR mismatched types [E0308]
light_flows_our_war_of_mocking_words(with_tears + 4);
//~^ ERROR mismatched types [E0308]
}

View file

@ -0,0 +1,26 @@
error[E0308]: mismatched types
--> $DIR/issue-46756-consider-borrowing-cast-or-binexpr.rs:20:42
|
20 | light_flows_our_war_of_mocking_words(behold as usize);
| ^^^^^^^^^^^^^^^
| |
| expected &usize, found usize
| help: consider borrowing here: `&(behold as usize)`
|
= note: expected type `&usize`
found type `usize`
error[E0308]: mismatched types
--> $DIR/issue-46756-consider-borrowing-cast-or-binexpr.rs:22:42
|
22 | light_flows_our_war_of_mocking_words(with_tears + 4);
| ^^^^^^^^^^^^^^
| |
| expected &usize, found usize
| help: consider borrowing here: `&(with_tears + 4)`
|
= note: expected type `&usize`
found type `usize`
error: aborting due to 2 previous errors