Skip to content

Commit

Permalink
special case removing & suggestion
Browse files Browse the repository at this point in the history
  • Loading branch information
Ezrashaw committed Jan 18, 2023
1 parent ca1178f commit b73cdf1
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 12 deletions.
8 changes: 8 additions & 0 deletions compiler/rustc_hir/src/hir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1787,6 +1787,14 @@ impl Expr<'_> {
expr
}

pub fn peel_borrows(&self) -> &Self {
let mut expr = self;
while let ExprKind::AddrOf(.., inner) = &expr.kind {
expr = inner;
}
expr
}

pub fn can_have_side_effects(&self) -> bool {
match self.peel_drop_temps().kind {
ExprKind::Path(_) | ExprKind::Lit(_) => false,
Expand Down
24 changes: 18 additions & 6 deletions compiler/rustc_hir_typeck/src/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
use super::FnCtxt;

use crate::type_error_struct;
use hir::ExprKind;
use rustc_errors::{
struct_span_err, Applicability, DelayDm, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
};
Expand Down Expand Up @@ -237,12 +238,23 @@ impl<'a, 'tcx> CastCheck<'tcx> {
fcx,
);

err.span_suggestion_verbose(
self.expr_span.shrink_to_lo(),
"dereference the expression",
"*",
Applicability::MachineApplicable,
);
if matches!(self.expr.kind, ExprKind::AddrOf(..)) {
// get just the borrow part of the expression
let span = self.expr_span.with_hi(self.expr.peel_borrows().span.lo());
err.span_suggestion_verbose(
span,
"remove the unneeded borrow",
"",
Applicability::MachineApplicable,
);
} else {
err.span_suggestion_verbose(
self.expr_span.shrink_to_lo(),
"dereference the expression",
"*",
Applicability::MachineApplicable,
);
}

err.emit();
}
Expand Down
3 changes: 2 additions & 1 deletion tests/ui/error-codes/E0606.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
fn main() {
&0u8 as u8; //~ ERROR E0606
let x = &(&0u8 as u8); //~ ERROR E0606
x as u8; //~ casting `&u8` as `u8` is invalid [E0606]
}
22 changes: 17 additions & 5 deletions tests/ui/error-codes/E0606.stderr
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
error[E0606]: casting `&u8` as `u8` is invalid
--> $DIR/E0606.rs:2:5
--> $DIR/E0606.rs:2:14
|
LL | &0u8 as u8;
| ^^^^^^^^^^
LL | let x = &(&0u8 as u8);
| ^^^^^^^^^^^^
|
help: remove the unneeded borrow
|
LL - let x = &(&0u8 as u8);
LL + let x = &(0u8 as u8);
|

error[E0606]: casting `&u8` as `u8` is invalid
--> $DIR/E0606.rs:3:5
|
LL | x as u8;
| ^^^^^^^
|
help: dereference the expression
|
LL | *&0u8 as u8;
LL | *x as u8;
| +

error: aborting due to previous error
error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0606`.

0 comments on commit b73cdf1

Please sign in to comment.