diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-12-08 23:18:03 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-08 23:18:03 +0100 |
| commit | 2411cd7c7abd3a4d4aba657961ca1f940e1657bd (patch) | |
| tree | c25a4d21c61974c8014b381375586c81009dd7d2 | |
| parent | e6b883c74f49f32cb5d1cbad3457f2b8805a4a38 (diff) | |
| parent | 37ca2eb8c269f48d5a6001394db57ab1c08c4312 (diff) | |
| download | rust-2411cd7c7abd3a4d4aba657961ca1f940e1657bd.tar.gz rust-2411cd7c7abd3a4d4aba657961ca1f940e1657bd.zip | |
Rollup merge of #91245 - cameron1024:suggest-i32-u32-char-cast, r=nagisa
suggest casting between i/u32 and char As discussed in https://github.com/rust-lang/rust/issues/91063 , this adds a suggestion for converting between i32/u32 <-> char with `as`, and a short explanation for why this is safe
| -rw-r--r-- | compiler/rustc_typeck/src/check/demand.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/cast/cast-int-to-char.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/cast/cast-int-to-char.stderr | 53 | ||||
| -rw-r--r-- | src/test/ui/match/match-type-err-first-arm.stderr | 5 | ||||
| -rw-r--r-- | src/test/ui/proc-macro/macro-brackets.stderr | 5 |
5 files changed, 84 insertions, 0 deletions
diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index b210c78cae0..b7e276b6965 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -1264,6 +1264,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 00000000000..379956968bd --- /dev/null +++ b/src/test/ui/cast/cast-int-to-char.rs @@ -0,0 +1,9 @@ +fn foo<T>(_t: T) {} + +fn main() { + foo::<u32>('0'); //~ ERROR + foo::<i32>('0'); //~ ERROR + foo::<u64>('0'); //~ ERROR + foo::<i64>('0'); //~ ERROR + foo::<char>(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 00000000000..55b9462db8d --- /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::<u32>('0'); + | ^^^ expected `u32`, found `char` + | +help: you can cast a `char` to a `u32`, since a `char` always occupies 4 bytes + | +LL | foo::<u32>('0' as u32); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:5:16 + | +LL | foo::<i32>('0'); + | ^^^ expected `i32`, found `char` + | +help: you can cast a `char` to an `i32`, since a `char` always occupies 4 bytes + | +LL | foo::<i32>('0' as i32); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:6:16 + | +LL | foo::<u64>('0'); + | ^^^ expected `u64`, found `char` + | +help: you can cast a `char` to a `u64`, since a `char` always occupies 4 bytes + | +LL | foo::<u64>('0' as u64); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:7:16 + | +LL | foo::<i64>('0'); + | ^^^ expected `i64`, found `char` + | +help: you can cast a `char` to an `i64`, since a `char` always occupies 4 bytes + | +LL | foo::<i64>('0' as i64); + | ++++++ + +error[E0308]: mismatched types + --> $DIR/cast-int-to-char.rs:8:17 + | +LL | foo::<char>(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 fd489afa84d..1cfe7ce1ed7 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 9aaf612eb54..d3516375291 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 |
