Rollup merge of #92715 - chordtoll:empty-string, r=davidtwco

Do not suggest char literal for zero-length strings

PR #92507 adds a hint to switch to single quotes when a char is expected and a single-character string literal is provided.

The check to ensure the string literal is one character long missed the 0-char case, and would incorrectly offer the hint.

This PR adds the missing check, and a test case to confirm the new behavior.
This commit is contained in:
Matthias Krüger 2022-02-08 16:40:47 +01:00 committed by GitHub
commit 8429dcdb79
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 3 deletions

View file

@ -2053,7 +2053,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
if let Some(code) =
code.strip_prefix('"').and_then(|s| s.strip_suffix('"'))
{
if code.chars().nth(1).is_none() {
if code.chars().count() == 1 {
err.span_suggestion(
span,
"if you meant to write a `char` literal, use single quotes",

View file

@ -1,6 +1,7 @@
// When a MULTI-character string literal is used where a char should be,
// When a MULTI/NO-character string literal is used where a char should be,
// DO NOT suggest changing to single quotes.
fn main() {
let _: char = "foo"; //~ ERROR mismatched types
let _: char = ""; //~ ERROR mismatched types
}

View file

@ -6,6 +6,14 @@ LL | let _: char = "foo";
| |
| expected due to this
error: aborting due to previous error
error[E0308]: mismatched types
--> $DIR/char-as-str-multi.rs:6:19
|
LL | let _: char = "";
| ---- ^^ expected `char`, found `&str`
| |
| expected due to this
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.