return None;
}
+ let parent_id = self.tcx.hir().get_parent_node_by_hir_id(expr.hir_id);
+ let mut is_struct_pat_shorthand_field = false;
+ if let Some(parent) = self.tcx.hir().find_by_hir_id(parent_id) {
+ // Account for fields
+ if let Node::Expr(hir::Expr {
+ node: hir::ExprKind::Struct(_, fields, ..), ..
+ }) = parent {
+ if let Ok(src) = cm.span_to_snippet(sp) {
+ for field in fields {
+ if field.ident.as_str() == src.as_str() && field.is_shorthand {
+ is_struct_pat_shorthand_field = true;
+ break;
+ }
+ }
+ }
+ }
+ };
+
match (&expected.sty, &checked_ty.sty) {
(&ty::Ref(_, exp, _), &ty::Ref(_, check, _)) => match (&exp.sty, &check.sty) {
(&ty::Str, &ty::Array(arr, _)) |
if let Some(sugg) = self.can_use_as_ref(expr) {
return Some(sugg);
}
- return Some(match mutability {
- hir::Mutability::MutMutable => {
- (sp, "consider mutably borrowing here", format!("&mut {}",
- sugg_expr))
+ return Some(match (mutability, is_struct_pat_shorthand_field) {
+ (hir::Mutability::MutMutable, false) => {
+ (sp, "consider mutably borrowing here",
+ format!("&mut {}", sugg_expr))
}
- hir::Mutability::MutImmutable => {
+ (hir::Mutability::MutImmutable, false) => {
(sp, "consider borrowing here", format!("&{}", sugg_expr))
}
+ (hir::Mutability::MutMutable, true) => {
+ (sp, "consider mutably borrowing here",
+ format!("{}: &mut {}", sugg_expr, sugg_expr))
+ }
+ (hir::Mutability::MutImmutable, true) => {
+ (sp, "consider borrowing here",
+ format!("{}: &{}", sugg_expr, sugg_expr))
+ }
});
}
}
checked,
sp) {
// do not suggest if the span comes from a macro (#52783)
- if let (Ok(code),
- true) = (cm.span_to_snippet(sp), sp == expr.span) {
+ if let (Ok(code), true) = (
+ cm.span_to_snippet(sp),
+ sp == expr.span,
+ ) {
return Some((
sp,
"consider dereferencing the borrow",
- format!("*{}", code),
+ if is_struct_pat_shorthand_field {
+ format!("{}: *{}", code, code)
+ } else {
+ format!("*{}", code)
+ },
));
}
}
found type `&u32`
error[E0308]: mismatched types
- --> $DIR/deref-suggestion.rs:22:9
+ --> $DIR/deref-suggestion.rs:30:9
|
LL | foo(&"aaa".to_owned());
| ^^^^^^^^^^^^^^^^^
found type `&std::string::String`
error[E0308]: mismatched types
- --> $DIR/deref-suggestion.rs:24:9
+ --> $DIR/deref-suggestion.rs:32:9
|
LL | foo(&mut "aaa".to_owned());
| ^^^^^^^^^^^^^^^^^^^^^
found type `&{integer}`
error[E0308]: mismatched types
- --> $DIR/deref-suggestion.rs:28:5
+ --> $DIR/deref-suggestion.rs:36:5
|
LL | assert_eq!(3i32, &3i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected i32, found &i32
found type `&i32`
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
-error: aborting due to 6 previous errors
+error[E0308]: mismatched types
+ --> $DIR/deref-suggestion.rs:39:17
+ |
+LL | let s = S { u };
+ | ^
+ | |
+ | expected &u32, found integer
+ | help: consider borrowing here: `u: &u`
+ |
+ = note: expected type `&u32`
+ found type `{integer}`
+
+error[E0308]: mismatched types
+ --> $DIR/deref-suggestion.rs:42:17
+ |
+LL | let r = R { i };
+ | ^
+ | |
+ | expected u32, found &{integer}
+ | help: consider dereferencing the borrow: `i: *i`
+ |
+ = note: expected type `u32`
+ found type `&{integer}`
+
+error: aborting due to 8 previous errors
For more information about this error, try `rustc --explain E0308`.