From 37ca2eb8c269f48d5a6001394db57ab1c08c4312 Mon Sep 17 00:00:00 2001 From: cameron Date: Sun, 28 Nov 2021 21:46:53 +0000 Subject: [PATCH] suggest cast char -> int --- compiler/rustc_typeck/src/check/demand.rs | 12 +++++ src/test/ui/cast/cast-int-to-char.rs | 9 ++++ src/test/ui/cast/cast-int-to-char.stderr | 53 +++++++++++++++++++ .../ui/match/match-type-err-first-arm.stderr | 5 ++ src/test/ui/proc-macro/macro-brackets.stderr | 5 ++ 5 files changed, 84 insertions(+) create mode 100644 src/test/ui/cast/cast-int-to-char.rs create mode 100644 src/test/ui/cast/cast-int-to-char.stderr diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index ece2d7b4f379..7b50132f5ff3 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -1173,6 +1173,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } true } + ( + &ty::Uint(ty::UintTy::U32 | ty::UintTy::U64 | ty::UintTy::U128) + | &ty::Int(ty::IntTy::I32 | ty::IntTy::I64 | ty::IntTy::I128), + &ty::Char, + ) => { + err.multipart_suggestion_verbose( + &format!("{}, since a `char` always occupies 4 bytes", cast_msg,), + cast_suggestion, + Applicability::MachineApplicable, + ); + true + } _ => false, } } diff --git a/src/test/ui/cast/cast-int-to-char.rs b/src/test/ui/cast/cast-int-to-char.rs new file mode 100644 index 000000000000..379956968bd5 --- /dev/null +++ b/src/test/ui/cast/cast-int-to-char.rs @@ -0,0 +1,9 @@ +fn foo(_t: T) {} + +fn main() { + foo::('0'); //~ ERROR + foo::('0'); //~ ERROR + foo::('0'); //~ ERROR + foo::('0'); //~ ERROR + foo::(0u32); //~ ERROR +} diff --git a/src/test/ui/cast/cast-int-to-char.stderr b/src/test/ui/cast/cast-int-to-char.stderr new file mode 100644 index 000000000000..55b9462db8df --- /dev/null +++ b/src/test/ui/cast/cast-int-to-char.stderr @@ -0,0 +1,53 @@ +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:4:16 + | +LL | foo::('0'); + | ^^^ expected `u32`, found `char` + | +help: you can cast a `char` to a `u32`, since a `char` always occupies 4 bytes + | +LL | foo::('0' as u32); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:5:16 + | +LL | foo::('0'); + | ^^^ expected `i32`, found `char` + | +help: you can cast a `char` to an `i32`, since a `char` always occupies 4 bytes + | +LL | foo::('0' as i32); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:6:16 + | +LL | foo::('0'); + | ^^^ expected `u64`, found `char` + | +help: you can cast a `char` to a `u64`, since a `char` always occupies 4 bytes + | +LL | foo::('0' as u64); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:7:16 + | +LL | foo::('0'); + | ^^^ expected `i64`, found `char` + | +help: you can cast a `char` to an `i64`, since a `char` always occupies 4 bytes + | +LL | foo::('0' as i64); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:8:17 + | +LL | foo::(0u32); + | ^^^^ expected `char`, found `u32` + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/match/match-type-err-first-arm.stderr b/src/test/ui/match/match-type-err-first-arm.stderr index fd489afa84db..1cfe7ce1ed72 100644 --- a/src/test/ui/match/match-type-err-first-arm.stderr +++ b/src/test/ui/match/match-type-err-first-arm.stderr @@ -6,6 +6,11 @@ LL | fn test_func1(n: i32) -> i32 { LL | match n { LL | 12 => 'b', | ^^^ expected `i32`, found `char` + | +help: you can cast a `char` to an `i32`, since a `char` always occupies 4 bytes + | +LL | 12 => 'b' as i32, + | ++++++ error[E0308]: `match` arms have incompatible types --> $DIR/match-type-err-first-arm.rs:18:14 diff --git a/src/test/ui/proc-macro/macro-brackets.stderr b/src/test/ui/proc-macro/macro-brackets.stderr index 9aaf612eb54a..d3516375291b 100644 --- a/src/test/ui/proc-macro/macro-brackets.stderr +++ b/src/test/ui/proc-macro/macro-brackets.stderr @@ -3,6 +3,11 @@ error[E0308]: mismatched types | LL | id![static X: u32 = 'a';]; | ^^^ expected `u32`, found `char` + | +help: you can cast a `char` to a `u32`, since a `char` always occupies 4 bytes + | +LL | id![static X: u32 = 'a' as u32;]; + | ++++++ error: aborting due to previous error