Fix regression #14007

This commit is contained in:
Guillaume Gomez 2025-01-18 17:13:53 +01:00
parent e35330cabe
commit 277bf089b3
3 changed files with 33 additions and 16 deletions

View file

@ -128,7 +128,11 @@ impl<'tcx> LateLintPass<'tcx> for LiteralStringWithFormattingArg {
pos.start += diff_len;
pos.end += diff_len;
let start = fmt_str[..pos.start].rfind('{').unwrap_or(pos.start);
let mut start = pos.start;
while start < fmt_str.len() && !fmt_str.is_char_boundary(start) {
start += 1;
}
let start = fmt_str[..start].rfind('{').unwrap_or(start);
// If this is a unicode character escape, we don't want to lint.
if start > 1 && fmt_str[..start].ends_with("\\u") {
continue;

View file

@ -19,6 +19,13 @@ fn compiler_macro() {
assert!(format!("{value}").is_ascii());
}
// Regression test for <https://github.com/rust-lang/rust-clippy/issues/14007>.
fn regression_14007() {
let s = "{и}";
let ш = 12;
let s = "{ш}"; //~ literal_string_with_formatting_args
}
fn main() {
let x: Option<usize> = None;
let y = "hello";

View file

@ -1,77 +1,83 @@
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:25:15
--> tests/ui/literal_string_with_formatting_arg.rs:26:14
|
LL | x.expect("{y} {}");
| ^^^
LL | let s = "{ш}";
| ^^^
|
= note: `-D clippy::literal-string-with-formatting-args` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::literal_string_with_formatting_args)]`
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:26:16
--> tests/ui/literal_string_with_formatting_arg.rs:32:15
|
LL | x.expect("{y} {}");
| ^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:33:16
|
LL | x.expect(" {y} bla");
| ^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:27:15
--> tests/ui/literal_string_with_formatting_arg.rs:34:15
|
LL | x.expect("{:?}");
| ^^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:28:15
--> tests/ui/literal_string_with_formatting_arg.rs:35:15
|
LL | x.expect("{y:?}");
| ^^^^^
error: these look like formatting arguments but are not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:29:16
--> tests/ui/literal_string_with_formatting_arg.rs:36:16
|
LL | x.expect(" {y:?} {y:?} ");
| ^^^^^ ^^^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:30:23
--> tests/ui/literal_string_with_formatting_arg.rs:37:23
|
LL | x.expect(" {y:..} {y:?} ");
| ^^^^^
error: these look like formatting arguments but are not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:31:16
--> tests/ui/literal_string_with_formatting_arg.rs:38:16
|
LL | x.expect(r"{y:?} {y:?} ");
| ^^^^^ ^^^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:32:16
--> tests/ui/literal_string_with_formatting_arg.rs:39:16
|
LL | x.expect(r"{y:?} y:?}");
| ^^^^^
error: these look like formatting arguments but are not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:33:19
--> tests/ui/literal_string_with_formatting_arg.rs:40:19
|
LL | x.expect(r##" {y:?} {y:?} "##);
| ^^^^^ ^^^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:34:14
--> tests/ui/literal_string_with_formatting_arg.rs:41:14
|
LL | assert!("{y}".is_ascii());
| ^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:36:18
--> tests/ui/literal_string_with_formatting_arg.rs:43:18
|
LL | x.expect("———{:?}");
| ^^^^
error: this looks like a formatting argument but it is not part of a formatting macro
--> tests/ui/literal_string_with_formatting_arg.rs:46:19
--> tests/ui/literal_string_with_formatting_arg.rs:53:19
|
LL | x.expect(r##" {x:?} "##); // `x` doesn't exist so we shoud not lint
| ^^^^^
error: aborting due to 12 previous errors
error: aborting due to 13 previous errors