Correctly handle string indices in literal_string_with_formatting_arg

This commit is contained in:
Guillaume Gomez 2024-12-16 16:55:09 +01:00
parent 968669b00a
commit ad695da7d2
3 changed files with 14 additions and 1 deletions

View file

@ -9,6 +9,7 @@
#![feature(iter_partition_in_place)]
#![feature(let_chains)]
#![feature(never_type)]
#![feature(round_char_boundary)]
#![feature(rustc_private)]
#![feature(stmt_expr_attributes)]
#![feature(unwrap_infallible)]

View file

@ -108,7 +108,15 @@ impl LateLintPass<'_> for LiteralStringWithFormattingArg {
if error.span.end >= current.len() {
break;
}
current = &current[error.span.end + 1..];
// We find the closest char to where the error location ends.
let pos = current.floor_char_boundary(error.span.end);
// We get the next character.
current = if let Some((next_char_pos, _)) = current[pos..].char_indices().nth(1) {
// We make the parser start from this new location.
&current[pos + next_char_pos..]
} else {
break;
};
diff_len = fmt_str.len() - current.len();
parser = Parser::new(current, None, None, false, ParseMode::Format);
} else if let Piece::NextArgument(arg) = piece {

View file

@ -30,4 +30,8 @@ fn main() {
}";
// Unicode characters escape should not lint either.
"\u{0052}".to_string();
// Regression test for <https://github.com/rust-lang/rust-clippy/issues/13838>.
let x: Option<usize> = Some(0);
x.expect("{…}");
}