make CastError::NeedsDeref create a MachineApplicable suggestion + other misc fixes

This commit is contained in:
Ezra Shaw 2023-01-16 20:24:01 +13:00
parent 41edaac716
commit ca1178f022
No known key found for this signature in database
GPG Key ID: 17CD5C2ADAE0D344
4 changed files with 29 additions and 31 deletions

View File

@ -151,7 +151,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub enum CastError { pub enum CastError {
ErrorGuaranteed, ErrorGuaranteed(ErrorGuaranteed),
CastToBool, CastToBool,
CastToChar, CastToChar,
@ -176,8 +176,8 @@ pub enum CastError {
} }
impl From<ErrorGuaranteed> for CastError { impl From<ErrorGuaranteed> for CastError {
fn from(_: ErrorGuaranteed) -> Self { fn from(err: ErrorGuaranteed) -> Self {
CastError::ErrorGuaranteed CastError::ErrorGuaranteed(err)
} }
} }
@ -225,11 +225,10 @@ impl<'a, 'tcx> CastCheck<'tcx> {
fn report_cast_error(&self, fcx: &FnCtxt<'a, 'tcx>, e: CastError) { fn report_cast_error(&self, fcx: &FnCtxt<'a, 'tcx>, e: CastError) {
match e { match e {
CastError::ErrorGuaranteed => { CastError::ErrorGuaranteed(_) => {
// an error has already been reported // an error has already been reported
} }
CastError::NeedDeref => { CastError::NeedDeref => {
let error_span = self.span;
let mut err = make_invalid_casting_error( let mut err = make_invalid_casting_error(
fcx.tcx.sess, fcx.tcx.sess,
self.span, self.span,
@ -237,21 +236,14 @@ impl<'a, 'tcx> CastCheck<'tcx> {
self.cast_ty, self.cast_ty,
fcx, fcx,
); );
let cast_ty = fcx.ty_to_string(self.cast_ty);
err.span_label( err.span_suggestion_verbose(
error_span, self.expr_span.shrink_to_lo(),
format!("cannot cast `{}` as `{}`", fcx.ty_to_string(self.expr_ty), cast_ty),
);
if let Ok(snippet) = fcx.sess().source_map().span_to_snippet(self.expr_span) {
err.span_suggestion(
self.expr_span,
"dereference the expression", "dereference the expression",
format!("*{}", snippet), "*",
Applicability::MaybeIncorrect, Applicability::MachineApplicable,
); );
} else {
err.span_help(self.expr_span, "dereference the expression with `*`");
}
err.emit(); err.emit();
} }
CastError::NeedViaThinPtr | CastError::NeedViaPtr => { CastError::NeedViaThinPtr | CastError::NeedViaPtr => {

View File

@ -2,10 +2,12 @@ error[E0606]: casting `&u8` as `u8` is invalid
--> $DIR/E0606.rs:2:5 --> $DIR/E0606.rs:2:5
| |
LL | &0u8 as u8; LL | &0u8 as u8;
| ----^^^^^^ | ^^^^^^^^^^
| | |
| cannot cast `&u8` as `u8` help: dereference the expression
| help: dereference the expression: `*&0u8` |
LL | *&0u8 as u8;
| +
error: aborting due to previous error error: aborting due to previous error

View File

@ -69,10 +69,12 @@ error[E0606]: casting `&u8` as `u32` is invalid
--> $DIR/error-festival.rs:37:18 --> $DIR/error-festival.rs:37:18
| |
LL | let y: u32 = x as u32; LL | let y: u32 = x as u32;
| -^^^^^^^ | ^^^^^^^^
| | |
| cannot cast `&u8` as `u32` help: dereference the expression
| help: dereference the expression: `*x` |
LL | let y: u32 = *x as u32;
| +
error[E0607]: cannot cast thin pointer `*const u8` to fat pointer `*const [u8]` error[E0607]: cannot cast thin pointer `*const u8` to fat pointer `*const [u8]`
--> $DIR/error-festival.rs:41:5 --> $DIR/error-festival.rs:41:5

View File

@ -243,10 +243,12 @@ error[E0606]: casting `&{float}` as `f32` is invalid
--> $DIR/cast-rfc0401.rs:71:30 --> $DIR/cast-rfc0401.rs:71:30
| |
LL | vec![0.0].iter().map(|s| s as f32).collect::<Vec<f32>>(); LL | vec![0.0].iter().map(|s| s as f32).collect::<Vec<f32>>();
| -^^^^^^^ | ^^^^^^^^
| | |
| cannot cast `&{float}` as `f32` help: dereference the expression
| help: dereference the expression: `*s` |
LL | vec![0.0].iter().map(|s| *s as f32).collect::<Vec<f32>>();
| +
error: aborting due to 34 previous errors error: aborting due to 34 previous errors