diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-01-14 07:47:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-14 07:47:34 +0100 |
| commit | 9d5cb209780c947e198966f2b406fbf830a9b04c (patch) | |
| tree | 7d42f04f474d5ab90fed35c9b3774ed87a0e0337 | |
| parent | 558da934c1f4133628bccecf9e6c625c360c51f3 (diff) | |
| parent | 8568f44fe172b0e7b7d9ce5a66d6e69ad9ffc669 (diff) | |
| download | rust-9d5cb209780c947e198966f2b406fbf830a9b04c.tar.gz rust-9d5cb209780c947e198966f2b406fbf830a9b04c.zip | |
Rollup merge of #92810 - compiler-errors:deduplicate-box-deref-suggestion, r=camelid
Deduplicate box deref and regular deref suggestions Remove the suggestion code special-cased for Box deref. r? ```@camelid``` since you introduced the code in #90627
| -rw-r--r-- | compiler/rustc_typeck/src/check/demand.rs | 37 | ||||
| -rw-r--r-- | src/test/ui/infinite/infinite-autoderef.stderr | 9 | ||||
| -rw-r--r-- | src/test/ui/occurs-check-2.stderr | 9 | ||||
| -rw-r--r-- | src/test/ui/occurs-check.stderr | 9 | ||||
| -rw-r--r-- | src/test/ui/span/coerce-suggestions.stderr | 9 | ||||
| -rw-r--r-- | src/test/ui/suggestions/boxed-variant-field.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/suggestions/boxed-variant-field.stderr | 2 | ||||
| -rw-r--r-- | src/test/ui/terr-sorts.stderr | 2 |
8 files changed, 38 insertions, 41 deletions
diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index b7e276b6965..c351a9f7040 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -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); + self.suggest_compatible_variants(err, expr, expected, expr_ty); if self.suggest_calling_boxed_future_when_appropriate(err, expr, expected, expr_ty) { return; } @@ -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( @@ -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" + } else if checked_ty.is_region_ptr() { "consider dereferencing the borrow" } else { "consider dereferencing the type" diff --git a/src/test/ui/infinite/infinite-autoderef.stderr b/src/test/ui/infinite/infinite-autoderef.stderr index 03e4718f5df..2d29f0592e1 100644 --- a/src/test/ui/infinite/infinite-autoderef.stderr +++ b/src/test/ui/infinite/infinite-autoderef.stderr @@ -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 diff --git a/src/test/ui/occurs-check-2.stderr b/src/test/ui/occurs-check-2.stderr index dcbfc81b4d5..b68c3fa5bcc 100644 --- a/src/test/ui/occurs-check-2.stderr +++ b/src/test/ui/occurs-check-2.stderr @@ -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 diff --git a/src/test/ui/occurs-check.stderr b/src/test/ui/occurs-check.stderr index 3e1ef2e719a..fdbbdc3abb3 100644 --- a/src/test/ui/occurs-check.stderr +++ b/src/test/ui/occurs-check.stderr @@ -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 diff --git a/src/test/ui/span/coerce-suggestions.stderr b/src/test/ui/span/coerce-suggestions.stderr index 74caae8645c..5a964c5d5cc 100644 --- a/src/test/ui/span/coerce-suggestions.stderr +++ b/src/test/ui/span/coerce-suggestions.stderr @@ -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); + | + error[E0308]: mismatched types --> $DIR/coerce-suggestions.rs:21:9 diff --git a/src/test/ui/suggestions/boxed-variant-field.rs b/src/test/ui/suggestions/boxed-variant-field.rs index 9b9e70a675f..e79be2f6127 100644 --- a/src/test/ui/suggestions/boxed-variant-field.rs +++ b/src/test/ui/suggestions/boxed-variant-field.rs @@ -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 } } diff --git a/src/test/ui/suggestions/boxed-variant-field.stderr b/src/test/ui/suggestions/boxed-variant-field.stderr index e865b993a4c..9a31dc89197 100644 --- a/src/test/ui/suggestions/boxed-variant-field.stderr +++ b/src/test/ui/suggestions/boxed-variant-field.stderr @@ -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), | + diff --git a/src/test/ui/terr-sorts.stderr b/src/test/ui/terr-sorts.stderr index 65d90678040..34d4d9eaded 100644 --- a/src/test/ui/terr-sorts.stderr +++ b/src/test/ui/terr-sorts.stderr @@ -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); | + |
