Skip to content

Commit

Permalink
rust-lang#91939: integer to char cast error, make more targeted
Browse files Browse the repository at this point in the history
  • Loading branch information
GKFX committed Jan 25, 2022
1 parent a15cb49 commit badb81a
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 5 deletions.
21 changes: 16 additions & 5 deletions compiler/rustc_typeck/src/check/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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!(
Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/consts/const-eval/const-eval-overflow-4b.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/error-codes/E0604.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/error-festival.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/mismatched_types/cast-rfc0401.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit badb81a

Please sign in to comment.