| #![warn(clippy::format_in_format_args, clippy::to_string_in_format_args)] |
| #![allow(unused)] |
| #![allow(clippy::assertions_on_constants, clippy::eq_op, clippy::uninlined_format_args)] |
| |
| use std::io::{Error, Write, stdout}; |
| use std::ops::Deref; |
| use std::panic::Location; |
| |
| macro_rules! my_macro { |
| () => { |
| // here be dragons, do not enter (or lint) |
| println!("error: {}", format!("something failed at {}", Location::caller())); |
| }; |
| } |
| |
| macro_rules! my_other_macro { |
| () => { |
| format!("something failed at {}", Location::caller()) |
| }; |
| } |
| |
| fn main() { |
| let error = Error::other("bad thing"); |
| let x = 'x'; |
| |
| println!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| println!("{}: {}", error, format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| println!("{:?}: {}", error, format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| println!("{{}}: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| println!(r#"error: "{}""#, format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| println!("error: {}", format!(r#"something failed at "{}""#, Location::caller())); |
| //~^ format_in_format_args |
| |
| println!("error: {}", format!("something failed at {} {0}", Location::caller())); |
| //~^ format_in_format_args |
| |
| let _ = format!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| let _ = write!( |
| //~^ format_in_format_args |
| stdout(), |
| "error: {}", |
| format!("something failed at {}", Location::caller()) |
| ); |
| let _ = writeln!( |
| //~^ format_in_format_args |
| stdout(), |
| "error: {}", |
| format!("something failed at {}", Location::caller()) |
| ); |
| print!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| eprint!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| eprintln!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| let _ = format_args!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| assert!(true, "error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| assert_eq!(0, 0, "error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| assert_ne!(0, 0, "error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| panic!("error: {}", format!("something failed at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| // negative tests |
| println!("error: {}", format_args!("something failed at {}", Location::caller())); |
| println!("error: {:>70}", format!("something failed at {}", Location::caller())); |
| println!("error: {} {0}", format!("something failed at {}", Location::caller())); |
| println!("{} and again {0}", format!("hi {}", x)); |
| my_macro!(); |
| println!("error: {}", my_other_macro!()); |
| } |
| |
| macro_rules! _internal { |
| ($($args:tt)*) => { |
| println!("{}", format_args!($($args)*)) |
| }; |
| } |
| |
| macro_rules! my_println2 { |
| ($target:expr, $($args:tt)+) => {{ |
| if $target { |
| _internal!($($args)+) |
| } |
| }}; |
| } |
| |
| macro_rules! my_println2_args { |
| ($target:expr, $($args:tt)+) => {{ |
| if $target { |
| _internal!("foo: {}", format_args!($($args)+)) |
| } |
| }}; |
| } |
| |
| fn test2() { |
| let error = Error::other("bad thing"); |
| |
| // None of these should be linted without the config change |
| my_println2!(true, "error: {}", format!("something failed at {}", Location::caller())); |
| my_println2!( |
| true, |
| "{}: {}", |
| error, |
| format!("something failed at {}", Location::caller()) |
| ); |
| |
| my_println2_args!(true, "error: {}", format!("something failed at {}", Location::caller())); |
| my_println2_args!( |
| true, |
| "{}: {}", |
| error, |
| format!("something failed at {}", Location::caller()) |
| ); |
| } |
| |
| #[clippy::format_args] |
| macro_rules! usr_println { |
| ($target:expr, $($args:tt)*) => {{ |
| if $target { |
| println!($($args)*) |
| } |
| }}; |
| } |
| |
| fn user_format() { |
| let error = Error::other("bad thing"); |
| let x = 'x'; |
| |
| usr_println!(true, "error: {}", format!("boom at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| usr_println!(true, "{}: {}", error, format!("boom at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| usr_println!(true, "{:?}: {}", error, format!("boom at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| usr_println!(true, "{{}}: {}", format!("boom at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| usr_println!(true, r#"error: "{}""#, format!("boom at {}", Location::caller())); |
| //~^ format_in_format_args |
| |
| usr_println!(true, "error: {}", format!(r#"boom at "{}""#, Location::caller())); |
| //~^ format_in_format_args |
| |
| usr_println!(true, "error: {}", format!("boom at {} {0}", Location::caller())); |
| //~^ format_in_format_args |
| } |