#91939: integer to char cast error, make more targeted

This commit is contained in:
George Bateman 2022-01-25 23:19:00 +00:00
parent a15cb49362
commit badb81a612
No known key found for this signature in database
GPG Key ID: C417AA9C4039EFCF
5 changed files with 40 additions and 5 deletions

View File

@ -328,17 +328,28 @@ impl<'a, 'tcx> CastCheck<'tcx> {
err.emit();
}
CastError::CastToChar => {
type_error_struct!(
let mut err = type_error_struct!(
fcx.tcx.sess,
self.span,
self.expr_ty,
E0604,
"only `u8` can be cast as `char`, not `{}`",
self.expr_ty
)
.span_label(self.span, "invalid cast")
.span_help(self.span, "try `char::from_u32` instead")
.emit();
);
err.span_label(self.span, "invalid cast");
if self.expr_ty.is_numeric() {
err.span_help(
self.span,
if self.expr_ty == fcx.tcx.types.i8 {
"try casting from `u8` instead"
} else if self.expr_ty == fcx.tcx.types.u32 {
"try `char::from_u32` instead"
} else {
"try `char::from_u32` instead (via a `u32`)"
},
);
}
err.emit();
}
CastError::NonScalar => {
let mut err = type_error_struct!(

View File

@ -17,6 +17,12 @@ error[E0604]: only `u8` can be cast as `char`, not `i8`
|
LL | : [u32; 5i8 as char as usize]
| ^^^^^^^^^^^ invalid cast
|
help: try casting from `u8` instead
--> $DIR/const-eval-overflow-4b.rs:22:13
|
LL | : [u32; 5i8 as char as usize]
| ^^^^^^^^^^^
error: aborting due to 3 previous errors

View File

@ -3,6 +3,12 @@ error[E0604]: only `u8` can be cast as `char`, not `u32`
|
LL | 1u32 as char;
| ^^^^^^^^^^^^ invalid cast
|
help: try `char::from_u32` instead
--> $DIR/E0604.rs:2:5
|
LL | 1u32 as char;
| ^^^^^^^^^^^^
error: aborting due to previous error

View File

@ -58,6 +58,12 @@ error[E0604]: only `u8` can be cast as `char`, not `u32`
|
LL | 0u32 as char;
| ^^^^^^^^^^^^ invalid cast
|
help: try `char::from_u32` instead
--> $DIR/error-festival.rs:25:5
|
LL | 0u32 as char;
| ^^^^^^^^^^^^
error[E0605]: non-primitive cast: `u8` as `Vec<u8>`
--> $DIR/error-festival.rs:29:5

View File

@ -99,6 +99,12 @@ error[E0604]: only `u8` can be cast as `char`, not `u32`
|
LL | let _ = 0x61u32 as char;
| ^^^^^^^^^^^^^^^ invalid cast
|
help: try `char::from_u32` instead
--> $DIR/cast-rfc0401.rs:41:13
|
LL | let _ = 0x61u32 as char;
| ^^^^^^^^^^^^^^^
error[E0606]: casting `bool` as `f32` is invalid
--> $DIR/cast-rfc0401.rs:43:13