Skip to content

Commit

Permalink
Auto merge of #10401 - samueltardieu:issue-10148, r=Alexendoo
Browse files Browse the repository at this point in the history
Do not panic when analyzing the malformed origin of a format string

Fixes #10148. This will trigger only when generating format strings while accepting weird things in a procedural macro and setting the span to something which is not a string.

changelog: none
  • Loading branch information
bors committed Feb 25, 2023
2 parents b528cc9 + 64775f3 commit 5155119
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 16 deletions.
9 changes: 8 additions & 1 deletion clippy_utils/src/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -391,11 +391,18 @@ impl FormatString {
};

let mut unescaped = String::with_capacity(inner.len());
// Sometimes the original string comes from a macro which accepts a malformed string, such as in a
// #[display(""somestring)] attribute (accepted by the `displaythis` crate). Reconstructing the
// string from the span will not be possible, so we will just return None here.
let mut unparsable = false;
unescape_literal(inner, mode, &mut |_, ch| match ch {
Ok(ch) => unescaped.push(ch),
Err(e) if !e.is_fatal() => (),
Err(e) => panic!("{e:?}"),
Err(_) => unparsable = true,
});
if unparsable {
return None;
}

let mut parts = Vec::new();
let _: Option<!> = for_each_expr(pieces, |expr| {
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/format.fixed
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// run-rustfix
// aux-build: proc_macro_with_span.rs
#![warn(clippy::useless_format)]
#![allow(
unused_tuple_struct_fields,
Expand All @@ -9,6 +10,8 @@
clippy::uninlined_format_args
)]

extern crate proc_macro_with_span;

struct Foo(pub String);

macro_rules! foo {
Expand Down Expand Up @@ -87,4 +90,7 @@ fn main() {
let _ = abc.to_string();
let xx = "xx";
let _ = xx.to_string();

// Issue #10148
println!(proc_macro_with_span::with_span!(""something ""));
}
6 changes: 6 additions & 0 deletions tests/ui/format.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// run-rustfix
// aux-build: proc_macro_with_span.rs
#![warn(clippy::useless_format)]
#![allow(
unused_tuple_struct_fields,
Expand All @@ -9,6 +10,8 @@
clippy::uninlined_format_args
)]

extern crate proc_macro_with_span;

struct Foo(pub String);

macro_rules! foo {
Expand Down Expand Up @@ -89,4 +92,7 @@ fn main() {
let _ = format!("{abc}");
let xx = "xx";
let _ = format!("{xx}");

// Issue #10148
println!(proc_macro_with_span::with_span!(""something ""));
}
30 changes: 15 additions & 15 deletions tests/ui/format.stderr
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
error: useless use of `format!`
--> $DIR/format.rs:19:5
--> $DIR/format.rs:22:5
|
LL | format!("foo");
| ^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"foo".to_string()`
|
= note: `-D clippy::useless-format` implied by `-D warnings`

error: useless use of `format!`
--> $DIR/format.rs:20:5
--> $DIR/format.rs:23:5
|
LL | format!("{{}}");
| ^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"{}".to_string()`

error: useless use of `format!`
--> $DIR/format.rs:21:5
--> $DIR/format.rs:24:5
|
LL | format!("{{}} abc {{}}");
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"{} abc {}".to_string()`

error: useless use of `format!`
--> $DIR/format.rs:22:5
--> $DIR/format.rs:25:5
|
LL | / format!(
LL | | r##"foo {{}}
Expand All @@ -34,67 +34,67 @@ LL ~ " bar"##.to_string();
|

error: useless use of `format!`
--> $DIR/format.rs:27:13
--> $DIR/format.rs:30:13
|
LL | let _ = format!("");
| ^^^^^^^^^^^ help: consider using `String::new()`: `String::new()`

error: useless use of `format!`
--> $DIR/format.rs:29:5
--> $DIR/format.rs:32:5
|
LL | format!("{}", "foo");
| ^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `"foo".to_string()`

error: useless use of `format!`
--> $DIR/format.rs:37:5
--> $DIR/format.rs:40:5
|
LL | format!("{}", arg);
| ^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `arg.to_string()`

error: useless use of `format!`
--> $DIR/format.rs:67:5
--> $DIR/format.rs:70:5
|
LL | format!("{}", 42.to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `42.to_string()`

error: useless use of `format!`
--> $DIR/format.rs:69:5
--> $DIR/format.rs:72:5
|
LL | format!("{}", x.display().to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `x.display().to_string()`

error: useless use of `format!`
--> $DIR/format.rs:73:18
--> $DIR/format.rs:76:18
|
LL | let _ = Some(format!("{}", a + "bar"));
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `a + "bar"`

error: useless use of `format!`
--> $DIR/format.rs:77:22
--> $DIR/format.rs:80:22
|
LL | let _s: String = format!("{}", &*v.join("/n"));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `(&*v.join("/n")).to_string()`

error: useless use of `format!`
--> $DIR/format.rs:83:13
--> $DIR/format.rs:86:13
|
LL | let _ = format!("{x}");
| ^^^^^^^^^^^^^^ help: consider using `.to_string()`: `x.to_string()`

error: useless use of `format!`
--> $DIR/format.rs:85:13
--> $DIR/format.rs:88:13
|
LL | let _ = format!("{y}", y = x);
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `x.to_string()`

error: useless use of `format!`
--> $DIR/format.rs:89:13
--> $DIR/format.rs:92:13
|
LL | let _ = format!("{abc}");
| ^^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `abc.to_string()`

error: useless use of `format!`
--> $DIR/format.rs:91:13
--> $DIR/format.rs:94:13
|
LL | let _ = format!("{xx}");
| ^^^^^^^^^^^^^^^ help: consider using `.to_string()`: `xx.to_string()`
Expand Down

0 comments on commit 5155119

Please sign in to comment.