Skip to content

Commit c921b7c

Browse files
committed
Get span_to_snippet and rewrite it more idiomatically
1 parent 51596bf commit c921b7c

File tree

4 files changed

+30
-44
lines changed

4 files changed

+30
-44
lines changed

compiler/rustc_hir_typeck/src/expr.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3278,24 +3278,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
32783278
}
32793279

32803280
fn suggest_first_deref_field(&self, err: &mut Diag<'_>, base: &hir::Expr<'_>, field: Ident) {
3281-
let full_span = base.span.to(field.span);
3282-
3283-
let base_snippet = self
3284-
.tcx
3285-
.sess
3286-
.source_map()
3287-
.span_to_snippet(base.span)
3288-
.unwrap_or_else(|_| "ptr".to_string());
3289-
3290-
let replacement = format!("(*{}).{}", base_snippet, field.name);
3291-
3292-
err.span_label(full_span, "unknown field access via raw pointer");
3293-
3294-
err.span_suggestion_verbose(
3295-
full_span,
3296-
"use `.` on a dereferenced raw pointer instead",
3297-
replacement,
3298-
Applicability::MachineApplicable,
3281+
err.span_label(field.span, "unknown field");
3282+
let val = if let Ok(base) = self.tcx.sess.source_map().span_to_snippet(base.span)
3283+
&& base.len() < 20
3284+
{
3285+
format!("{base}")
3286+
} else {
3287+
"the value".to_string()
3288+
};
3289+
err.multipart_suggestion(
3290+
format!("`{val}` is a raw pointer; try dereferencing it"),
3291+
vec![
3292+
(base.span.shrink_to_lo(), "(*".into()),
3293+
(base.span.to(field.span.shrink_to_lo()), format!("{val}).")),
3294+
],
3295+
Applicability::MaybeIncorrect,
32993296
);
33003297
}
33013298

tests/ui/issues/issue-11004.stderr

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,23 @@ error[E0609]: no field `x` on type `*mut A`
22
--> $DIR/issue-11004.rs:7:21
33
|
44
LL | let x : i32 = n.x;
5-
| --^
6-
| |
7-
| unknown field access via raw pointer
5+
| ^ unknown field
86
|
9-
help: use `.` on a dereferenced raw pointer instead
10-
|
11-
LL - let x : i32 = n.x;
12-
LL + let x : i32 = (*n).x;
7+
help: `n` is a raw pointer; try dereferencing it
138
|
9+
LL | let x : i32 = (*n).x;
10+
| ++ +
1411

1512
error[E0609]: no field `y` on type `*mut A`
1613
--> $DIR/issue-11004.rs:8:21
1714
|
1815
LL | let y : f64 = n.y;
19-
| --^
20-
| |
21-
| unknown field access via raw pointer
22-
|
23-
help: use `.` on a dereferenced raw pointer instead
16+
| ^ unknown field
2417
|
25-
LL - let y : f64 = n.y;
26-
LL + let y : f64 = (*n).y;
18+
help: `n` is a raw pointer; try dereferencing it
2719
|
20+
LL | let y : f64 = (*n).y;
21+
| ++ +
2822

2923
error: aborting due to 2 previous errors
3024

tests/ui/suggestions/parenthesized-deref-suggestion.stderr

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ error[E0609]: no field `opts` on type `*const Session`
22
--> $DIR/parenthesized-deref-suggestion.rs:7:30
33
|
44
LL | (sess as *const Session).opts;
5-
| -------------------------^^^^
6-
| |
7-
| unknown field access via raw pointer
5+
| ^^^^ unknown field
86
|
9-
help: use `.` on a dereferenced raw pointer instead
7+
help: `the value` is a raw pointer; try dereferencing it
108
|
119
LL - (sess as *const Session).opts;
12-
LL + (*(sess as *const Session)).opts;
10+
LL + (*the value).opts;
1311
|
1412

1513
error[E0609]: no field `0` on type `[u32; 1]`

tests/ui/unsafe/unsafe-fn-autoderef.stderr

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ error[E0609]: no field `f` on type `*const Rec`
22
--> $DIR/unsafe-fn-autoderef.rs:19:14
33
|
44
LL | return p.f;
5-
| --^
6-
| |
7-
| unknown field access via raw pointer
5+
| ^ unknown field
86
|
9-
help: use `.` on a dereferenced raw pointer instead
10-
|
11-
LL - return p.f;
12-
LL + return (*p).f;
7+
help: `p` is a raw pointer; try dereferencing it
138
|
9+
LL | return (*p).f;
10+
| ++ +
1411

1512
error: aborting due to 1 previous error
1613

0 commit comments

Comments
 (0)