Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deduplicate box deref and regular deref suggestions #92810

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 11 additions & 26 deletions compiler/rustc_typeck/src/check/demand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
error: TypeError<'tcx>,
) {
self.annotate_expected_due_to_let_ty(err, expr, error);
self.suggest_box_deref(err, expr, expected, expr_ty);
self.suggest_compatible_variants(err, expr, expected, expr_ty);
self.suggest_deref_ref_or_into(err, expr, expected, expr_ty, expected_ty_expr);
camelid marked this conversation as resolved.
Show resolved Hide resolved
self.suggest_compatible_variants(err, expr, expected, expr_ty);
if self.suggest_calling_boxed_future_when_appropriate(err, expr, expected, expr_ty) {
return;
}
Expand Down Expand Up @@ -259,23 +258,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
}

fn suggest_box_deref(
&self,
err: &mut DiagnosticBuilder<'_>,
expr: &hir::Expr<'_>,
expected: Ty<'tcx>,
expr_ty: Ty<'tcx>,
) {
if expr_ty.is_box() && expr_ty.boxed_ty() == expected {
err.span_suggestion_verbose(
expr.span.shrink_to_lo(),
"try dereferencing the `Box`",
"*".to_string(),
Applicability::MachineApplicable,
);
}
}

/// If the expected type is an enum (Issue #55250) with any variants whose
/// sole field is of the found type, suggest such variants. (Issue #42764)
fn suggest_compatible_variants(
Expand Down Expand Up @@ -857,14 +839,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
Applicability::MachineApplicable,
false,
));
} else if self.infcx.type_is_copy_modulo_regions(
self.param_env,
expected,
sp,
) {
// For this suggestion to make sense, the type would need to be `Copy`.
}

// For this suggestion to make sense, the type would need to be `Copy`,
// or we have to be moving out of a `Box<T>`
if self.infcx.type_is_copy_modulo_regions(self.param_env, expected, sp)
|| checked_ty.is_box()
{
if let Ok(code) = sm.span_to_snippet(expr.span) {
let message = if checked_ty.is_region_ptr() {
let message = if checked_ty.is_box() {
"consider unboxing the value"
camelid marked this conversation as resolved.
Show resolved Hide resolved
} else if checked_ty.is_region_ptr() {
"consider dereferencing the borrow"
} else {
"consider dereferencing the type"
Expand Down
9 changes: 6 additions & 3 deletions src/test/ui/infinite/infinite-autoderef.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ error[E0308]: mismatched types
--> $DIR/infinite-autoderef.rs:20:13
|
LL | x = Box::new(x);
| ^^^^^^^^^^^- help: try using a conversion method: `.to_string()`
| |
| cyclic type of infinite size
| ^^^^^^^^^^^ cyclic type of infinite size
|
help: consider unboxing the value
|
LL | x = *Box::new(x);
| +

error[E0055]: reached the recursion limit while auto-dereferencing `Foo`
--> $DIR/infinite-autoderef.rs:25:5
Expand Down
9 changes: 6 additions & 3 deletions src/test/ui/occurs-check-2.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ error[E0308]: mismatched types
--> $DIR/occurs-check-2.rs:7:9
|
LL | f = Box::new(g);
| ^^^^^^^^^^^- help: try using a conversion method: `.to_string()`
| |
| cyclic type of infinite size
| ^^^^^^^^^^^ cyclic type of infinite size
|
help: consider unboxing the value
|
LL | f = *Box::new(g);
| +

error: aborting due to previous error

Expand Down
9 changes: 6 additions & 3 deletions src/test/ui/occurs-check.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ error[E0308]: mismatched types
--> $DIR/occurs-check.rs:5:9
|
LL | f = Box::new(f);
| ^^^^^^^^^^^- help: try using a conversion method: `.to_string()`
| |
| cyclic type of infinite size
| ^^^^^^^^^^^ cyclic type of infinite size
|
help: consider unboxing the value
|
LL | f = *Box::new(f);
| +

error: aborting due to previous error

Expand Down
9 changes: 6 additions & 3 deletions src/test/ui/span/coerce-suggestions.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ error[E0308]: mismatched types
--> $DIR/coerce-suggestions.rs:17:9
|
LL | f = Box::new(f);
| ^^^^^^^^^^^- help: try using a conversion method: `.to_string()`
| |
| cyclic type of infinite size
| ^^^^^^^^^^^ cyclic type of infinite size
|
help: consider unboxing the value
|
LL | f = *Box::new(f);
| +
camelid marked this conversation as resolved.
Show resolved Hide resolved

error[E0308]: mismatched types
--> $DIR/coerce-suggestions.rs:21:9
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/suggestions/boxed-variant-field.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ fn foo(x: Ty) -> Ty {
Ty::Unit => Ty::Unit,
Ty::List(elem) => foo(elem),
//~^ ERROR mismatched types
//~| HELP try dereferencing the `Box`
//~| HELP consider unboxing the value
//~| HELP try wrapping
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/suggestions/boxed-variant-field.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ LL | Ty::List(elem) => foo(elem),
|
= note: expected enum `Ty`
found struct `Box<Ty>`
help: try dereferencing the `Box`
help: consider unboxing the value
|
LL | Ty::List(elem) => foo(*elem),
| +
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/terr-sorts.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ LL | want_foo(b);
|
= note: expected struct `Foo`
found struct `Box<Foo>`
help: try dereferencing the `Box`
help: consider unboxing the value
|
LL | want_foo(*b);
| +
Expand Down